2013-10-14 7 views
0

Я не знаю, как сообщить Iconv, чтобы перекодировать мои строки на удобочитаемый вывод.Как конвертировать UTF8 в cp1252 правильно (1.8.7)

Пример: Я конвертирую «ЛАТИНСКОЕ КАПИТАЛ ПИСЬМА С КАРОНОМ» U+0160, отображаемое как Š.

Iconv.conv('cp1252', 'UTF8', 'Š'), однако возвращает "\212"

Я бы ожидать, что она возвращает эквивалентный CP1252 характер, 0x8A, также показан как Š. Однако напечатанный результат по-прежнему "\212" - это восьмеричное представление (\212 - это восьмеричное значение для 0x8A или 138).

Я также пробовал некоторые более экзотические инструкции кодирования, такие как cp1252//IGNORE//TRANSLIT, с тем же выходом.

Что я делаю неправильно, и как это сделать?

Спасибо

EDIT

Каспер говорит, консольный вывод должен корректно отобразить характер, но это не так. Возможно, я просто не знаю, как установить его для принятия cp1252.

Я был бы признателен, если кто-нибудь может сказать мне, как это сделать - я работаю на Ubuntu 13.04 и как регулярно Баш с IRB и RubyMine встроенный в дисплей консоли вывода как "\212"

Выходом localeen_US.UTF8 для всех значений.

Iconv.conv('cp1252', 'UTF8', 'Š').inspect печатает "\"\\212\""

Iconv.conv('cp1252', 'UTF8', 'Š').each_byte { |b| p b } печатает 138 и "\212"

+2

Звучит правильно для меня. 'puts '\ 212" 'должен выводить то, что вам нужно, когда ваш терминал настроен на cp1252? – Casper

+0

Casper прав - вы должны получить строку от Ruby до устройства, которое знает, как правильно отображать его. Ruby не отображает глиф для вас, и если в сомнении 'irb' или' inspect' выведет экранированный восьмеричный так, по крайней мере, вы можете однозначно увидеть, что находится в строке. –

+0

@ Каспер, это то, чего я ожидал, однако я получаю буквально «\ 212», вот почему я спрашиваю. См. Редактирование. – kostja

ответ

2

Вы осматривая значение. От IRB:

$ irb 
>> "\x8A" 
=> "\212" 

Это то же самое, как:

>> puts "\x8A".inspect 
"\212" 
=> nil 

Вместо этого вы должны напечатать значение:

>> puts "\x8A" 
� 
=> nil 

мой терминал отображает "" потому что 0x8A является неправильная последовательность в UTF-8 (кодировка моего терминала). Если я изменю свой терминал на CP-1252, он отобразит «Š».

Смежные вопросы