我有一个ISO-2022-JP-2字符串,需要将其转换为UTF-8,但出现错误。
更具体地说:我正在尝试阅读使用quoted-printable传输的电子邮件。这封电子邮件包含单词tōtatsu
(请注意o上方的重音符号),我正在像这样转换给定的文本:
given = "t=1B$(D+W=1B(Btatsu"
text = given.unpack("M*").first #convert from quoted-printable
基本上,它将替换=1B
为适当的\e
转义字符,并且字符串text
变为t␛$(D+W␛(Btatsu
。
Wikipedia表示该语言␛$(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?
似乎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"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句