Преобразование из ISO-2022-JP-2 в UTF-8 в Ruby 2.1

У меня есть строка ISO-2022-JP-2, и мне нужно преобразовать ее в UTF-8, но я получаю сообщение об ошибке.

Чтобы быть более конкретным: я пытаюсь прочитать электронное письмо, которое передается с использованием кавычек-печати. Это электронное письмо содержит слово tōtatsu (обратите внимание на ударение над буквой o), и я преобразую данный текст следующим образом:

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

По сути, это заменит =1B правильным escape-символом \e, а строка в text станет t␛$(D+W␛(Btatsu.

Википедия говорит, что ␛$(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?


person Mark Gaensicke    schedule 25.05.2014    source источник


Ответы (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"
person falsetru    schedule 25.05.2014
comment
всякий раз, когда вы появлялись, проблемы сами попадали в проблемы. Ты знаешь почему? - Поскольку проблемы узнают, теперь они будут уничтожены вами :-) - person Arup Rakshit; 25.05.2014