2012-10-21 91 views
24

我每次嘗試將散列轉換爲JSON字符串時都會收到Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8。我試着用[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ]),鏈接.encode.force_encoding,向後切換參數,但似乎沒有任何工作,所以我抓住了這樣的錯誤:Encoding :: UndefinedConversionError

begin 
    menu.to_json 
rescue Encoding::UndefinedConversionError 
    puts $!.error_char.dump 
    p $!.error_char.encoding 
end 

如果菜單是續集的dataset.to_hash從一個MySQL數據庫的內容,utf8_general_ci編碼,並返回這樣的:

「\ XC2」

< #Encoding:ASCII-8BIT>

無論使用什麼.encode/.force_encoding,編碼都不會改變。我甚至試圖更換字符串.gsub!(/\\\xC2/)沒有運氣。

任何想法?

+1

1.你試過這個嗎? 'menu.force_encoding(「ISO-8859-1」)。encode(「UTF-8」)' 3,在所有.rb文件的頂部添加一個「#encoding」utf-8''字符串 3 。檢查你的環境設置你的終端中的'$ echo LC_CTYPE'是什麼意思? – Kashyap

+0

步驟1是否失敗並出現錯誤?步驟2是否工作?對於步驟3,http://thegreyblog.blogspot.in/2012/02/ fix-mac-os-x-lions-ssh-utf-8-issues.html這個鏈接有你的程序必須運行的env設置,以避免你想避免這個問題。 – Kashyap

回答

62
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?') 

這完美地工作,我不得不更換一些額外的字符,但目前還沒有更多的錯誤。

+1

奇妙的解決方案 - 解決了我處理SQL Server中奇怪類型的問題。謝謝! –

+0

謝謝。我喜歡在不潛入文檔的情況下找到答案。 –

+0

謝謝!它也適用於我,官方的紅寶石文檔供將來參考[這裏](http://www.ruby-doc.org/core-2.1.2/String.html#method-i-encode) – jmoreira

14

你對「\ xC2」有什麼期望?可能是一個Â

與ASCII-8BIT你有二進制數據,紅寶石不能決定,應該是什麼。

您必須首先使用force_encoding設置編碼。

你可以試試下面的代碼:

Encoding.list.each{|enc| 
    begin 
    print "%-10s\t" % [enc] 
    print "\t\xC2".force_encoding(enc) 
    print "\t\xC2".force_encoding(enc).encode('utf-8') 
    rescue => err 
    print "\t#{err}" 
    end 
    print "\n" 
} 

結果是在你的「\ XC2」不同編碼的可能值。

結果可能取決於您的輸出格式,但我認爲您可以猜出您的編碼。

當你定義的編碼,你需要(可能是CP1251),您可以

menu.force_encoding('cp1252').to_json 

參見Kashyaps評論。

+0

這就是我所做的: '編碼.list.each {| enc | begin print「%-10s \ t」%[enc] print menu.to_json.force_encoding(enc) print menu.to_json.force_encoding(enc).encode('utf-8 ') 救援=>犯錯 打印 「\ t#{}犯錯」 結束 打印 「\ n」 }' ,這就是我得爲每個結果: 'SJIS,KDDI 「\ XC2」從ASCII-8BIT到UTF-8 – martriay

7

如果你不在乎失去了奇怪的字符,你可以吹他們去

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '') 
+0

沒有工作:( 編碼:: UndefinedConversionError在/菜單「\ xC2」從ASCII-8BIT到UTF-8 – martriay

+3

menu.to_s.encode('UTF-8',{ :無效=>:替換,:undef =>:替換,:替換=>'?'}) - >這工作! :D – martriay

6

您的自動接受解決方案不起作用,實際上沒有錯誤,但它是非JSON。

我使用oj gem解決了這個問題,它現在可以找到。它也比標準的JSON庫更快。

書面方式:

menu_json = Oj.dump menu 

閱讀:

menu2 = Oj.load menu_json 

https://github.com/ohler55/oj瞭解更多詳情。我希望這會有所幫助。

+0

問題是錯誤,而不是JSON部分。因此,我的自動接受答案有效。無論如何,我會鼓勵你提供替代解決方案。 – martriay

+0

好吧,我同意你的觀點,不再有錯誤,但它不是json字符串。我不知道你的目的是什麼,但我需要加載我的JSON,並且我想要一個有效的JSON字符串。 或者我錯過了你提出的解決方案中的一些東西? – gvo

+0

這個問題只是關於錯誤,我不是說我的答案是最好的選擇,顯然它不是爲了你的目的,而是解決了提出的問題:編碼錯誤。我在問題中提到的JSON是用於情境化的目的。 – martriay

相關問題