Ruby, пакетное кодирование (ASCII-8BIT, которое нельзя преобразовать в UTF-8) - PullRequest
1 голос
/ 09 марта 2012
puts "C3A9".lines.to_a.pack('H*').encoding

результат в

ASCII-8BIT

но я предпочитаю этот текст в UTF-8. Но

"C3A9".lines.to_a.pack('H*').encode("UTF-8")

результаты в

`encode': "\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)

почему? Как я могу конвертировать его в UTF-8?

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

Вы идете об этом неправильно. Если у вас есть данные в кодировке URI, например:

%C5%BBaba

Тогда вы должны использовать URI.unescape для его декодирования:

1.9.2-head :004 > URI.unescape('%C5%BBaba')
 => "Żaba"

Если это не сработает, введите кодировку UTF-8:

1.9.2-head :004 > URI.unescape('%C5%BBaba').force_encoding('utf-8')
 => "Żaba"
4 голосов
/ 09 марта 2012

ASCII-8bit - это кодировка для Ruby. У него псевдоним BINARY, и это просто так. ASCII-8bit это не кодировка символов, а скорее способ сказать, что строка является двоичными данными и не должна обрабатываться как текст. Поскольку функции pack / unpack предназначены для работы с двоичными данными, вы никогда не должны предполагать, что возвращаемый файл может быть распечатан в любой кодировке, если строка пакета ВЕСЬ не состоит из символьных производных. Если вы уточните, какова общая цель, возможно, мы могли бы дать вам лучшее решение.


Если вы изолируете шестнадцатеричный код UTF-8 в переменную, скажем code, которая является строкой шестнадцатеричного формата минус знак процента:

utf_char=[code.to_i(16)].pack("U")

Объедините их с остальной частью строки, вы можете сделать свою строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...