2011-09-08 13 views
7

मैं गूगल के प्रवेश से कुछ क्षेत्रोंरेल omniauth और UTF-8 त्रुटियों

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8

"omniauth"=> 
    {"user_info"=> 
    {"name"=>"Joe McÙisnean", 
    "last_name"=>"McÙisnean", 
    "first_name"=>"Joe", 
    "email"=>"[email protected]"}, 
    "uid"=> 
    "https://www.google.com/accounts/o8/id?id=AItOawnQmfdfsdfsdfdsfsdhGWmuLTiX2Id40k", 
    "provider"=>"google_apps"} 

मेरे उपयोगकर्ता मॉडल में

def apply_omniauth(omniauth) 
    #add some info about the user 
    self.email = omniauth['user_info']['email'] if email.blank? 
    self.name = omniauth['user_info']['name'] if name.blank? 
    self.name = omniauth['user_info'][:name] if name.blank? 
    self.nickname = omniauth['user_info']['nickname'] if nickname.blank? 
    self.nickname = name.gsub(' ','').downcase if nickname.blank? 

    unless omniauth['credentials'].blank? 
     user_tokens.build(:provider => omniauth['provider'], 
         :uid => omniauth['uid'], 
         :token => omniauth['credentials']['token'], 
         :secret => omniauth['credentials']['secret']) 
    else 
     user_tokens.build(:provider => omniauth['provider'], :uid => omniauth['uid']) 
    end 
    end 

मैं नहीं कर रहा हूँ पॉप्युलेट करने के लिए कोशिश कर रहा omniauth का उपयोग कर हाल ही में एक त्रुटि थी यूटीएफ एन्कोडिंग के बारे में बेहद जानकार, इसलिए मुझे यकीन नहीं है कि मुझे एन्कोडिंग निर्दिष्ट करना चाहिए? लेकिन मुझे लगता है कि इसे उपयोगकर्ता मॉडल में डालने से पहले यहां बनाया गया है, मुझे यकीन है कि इसके बारे में क्या करना है?

अद्यतन:

रेल 3.0.10 Omniauth 0.2.6 रूबी 1.9.2 पीजी 0.11.0

डिफ़ॉल्ट एन्कोडिंग है UTF-8

यही प्रतीत नहीं किया था यह है, इसलिए मैं आगे खोदा और ध्यान में रखते हुए इस पाया:

Showing /Users/holden/Code/someapp/app/views/users/registrations/_signup.html.erb where line #5 raised: 

incompatible character encodings: ASCII-8BIT and UTF-8 
Extracted source (around line #5): 

2: <%= f.error_messages %> 
3: 
4: <%= f.input :name, :hint => 'your real name' %> 
5: <%= f.input :nickname, :hint => 'Username of your choosing' %> 
6: 
7: <% unless @user.errors[:email].present? or @user.email %> 
8:  <%= f.input :email, :as => :hidden %> 

अद्यतन अद्यतन:

ऐसा लगता है कि यह सर्वव्यापी मणि है जो एएससीआईआई -8 बीआईटी वर्ण देता है, इसलिए मेरा अगला सवाल यह है कि मैं हैश को कैसे पार्स कर सकता हूं और इसे वापस यूटीएफ 8 में परिवर्तित कर सकता हूं, इसलिए मेरा ऐप विस्फोट नहीं करता है?

session[:omniauth] = omniauth.to_utf8

इस पागल सवारी करने के लिए एक अन्य भाग जब मैं कंसोल

d={"user_info"=>{"email"=>"[email protected]", "first_name"=>"Joe", "last_name"=>"Mc\xC3\x99isnean", "name"=>"Joe Mc\xC3\x99isnean"}} 

यह स्वचालित रूप से UTF-8 में बदल देता में इस प्रकार है, लेकिन यह जब एक सत्र में shoved फट जाएगा

=> {"user_info"=>{"email"=>"[email protected]", "first_name"=>"Joe", "last_name"=>"McÙisnean", "name"=>"Joe McÙisnean"}} 

यह एक दर्दनाक दुःस्वप्न है यदि कभी कोई था।

omniauth_controller.rb

session[:omniauth] = omniauth.to_utf8 

जोड़ा परिवर्तित मजबूर करने के लिए पुनरावर्ती विधि:

+1

आप रेल, रूबी और omniauth के अपने संस्करण डाल सकते हैं? –

+0

आप स्ट्रिंग के वर्ण एन्कोडिंग को 'string.encoding.name' के साथ भी देख सकते हैं। –

+0

किया गया। मैंने अपने प्रश्न के संस्करणों को जोड़ा, और एक रिकॉर्डिंग रिकॉर्ड का एन्कोडिंग.नाम "यूटीएफ -8" – holden

उत्तर

4

Omniauth समस्या उत्पादन साबित हुई ASCII-8bit

मैं का उपयोग कर प्रस्तुत करने में Omniauth हैश मजबूर कर समाप्त हो गया दुष्ट ASCII-8bit UTF8 को

some_initializer.rb

+०१२३५१६४१०६
class Hash 
    def to_utf8 
    Hash[ 
     self.collect do |k, v| 
     if (v.respond_to?(:to_utf8)) 
      [ k, v.to_utf8 ] 
     elsif (v.respond_to?(:encoding)) 
      [ k, v.dup.force_encode('UTF-8') ] 
     else 
      [ k, v ] 
     end 
     end 
    ] 
    end 
end 

tadman को विशेष धन्यवाद

recursively convert hash containing non-UTF chars to UTF

संबंधित मुद्दे