在Ruby 2.1中从ISO-2022-JP-2转换为UTF-8

时间:2014-05-25 04:38:18

标签: ruby string encoding utf-8 ruby-2.1

我有一个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 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 个答案:

答案 0 :(得分: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"