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 说它用于␛$(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?

4

1 回答 1

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"
于 2014-05-25T04:56:16.357 回答