2014-05-25 20 views
1

我有一個ISO-2022-JP-2串並需要將其轉換爲UTF-8,但我得到一個錯誤。從ISO-2022-JP-2轉換爲UTF-8的Ruby 2.1

更具體:我想讀這是使用引用可打印傳送的電子郵件。此電子郵件包含單詞tōtatsu(注意哦,天上的口音),我將指定文字是這樣的:

given = "t=1B$(D+W=1B(Btatsu" 
text = given.unpack("M*").first #convert from quoted-printable 

基本上,這需要通過正確\e轉義字符和text成爲t␛$(D+W␛(Btatsu的字符串替換=1B

Wikipedia says表示␛$(D用於切換到JIS X 0212-1990,同樣␛(B用於切換回ASCII。請注意,在␛$(D ISO-2022-JP-2是新的,它是原來的ISO-2022-JP的一部分。

但是,字符串的編碼仍然是ASCII,所以我想我必須強制正確的編碼,因爲Ruby沒有知道實際串的方式ISO-2022-JP-2?

puts text.encoding # ASCII-8BIT 
text = text.force_encoding('iso-2022-jp-2') 

現在事實證明,

text.encode('utf-8') 

不能給定的字符串轉換:code converter not found (ISO-2022-JP-2 to UTF-8) (Encoding::ConverterNotFoundError)

我怎麼能這個字符串轉換爲UTF-8?

回答

1

看起來像Ruby 2.1不支持iso-2022-jp-2編碼:

>> "t\e$(D+W\e(Btatsu".encode('utf-8', 'iso-8859-1') 
=> "t\e$(D+W\e(Btatsu" 

>> "t\e$(D+W\e(Btatsu".encode('utf-8', 'iso-2022-jp-2') 
Encoding::ConverterNotFoundError: code converter not found (ISO-2022-JP-2 to UTF-8) 
     from (irb):1:in `encode' 
     from (irb):1 
     from /home/falsetru/.rvm/rubies/ruby-2.1.2/bin/irb:11:in `<main>' 

您可以使用iconv代替:

require 'iconv' 
Iconv.conv('utf-8', 'iso-2022-jp-2', "t\e$(D+W\e(Btatsu") 
# => "tōtatsu" 
+0

只要你一出現,*問題*自己墜入*問題*。你知道爲什麼? - 因爲*問題*瞭解,他們現在將被你們抹去:-) –