Символы Unicode в сценарии Ruby?

Я хотел бы записать сценарий Ruby, который пишет японские символы в консоль. Например:

puts "こんにちは・今日は"

Однако я получаю исключение при выполнении его:

jap.rb:1: Invalid char `\377' in expression
jap.rb:1: Invalid char `\376' in expression

Можно ли это сделать? Я использую Ruby 1.8.6.

8
задан Shay Friedman 14 August 2010 в 15:57
поделиться

1 ответ

Вы сохранили файл в кодировке UTF-16LE, которую Windows ошибочно называет «Unicode». Этого кодирования, как правило, лучше избегать, потому что это не надмножество ASCII: каждая единица кода хранится как два байта, а символы ASCII имеют другой байт, сохраненный как \ 0 . Это запутает очень много программного обеспечения; использование UTF-16 для хранения файлов необычно.

То, что вы видите с \ 377 и \ 376 (восьмеричное для \ xFF и \ xFE ), - это U + Последовательность FEFF Byte Order Mark помещается в начале файлов UTF-16, чтобы отличать UTF-16LE от UTF-16BE.

Ruby 1.8 полностью основан на байтах; он не пытается читать символы Unicode из сценария. Таким образом, вы можете сохранять исходные файлы только в кодировках, совместимых с ASCII. Обычно вы хотите сохранять свои файлы в формате UTF-8 (без спецификации; ложная спецификация UTF-8 - еще одно замечательное нововведение Microsoft, которое ломает все). Это отлично подойдет для скриптов в Интернете, создающих страницы UTF-8.

И если вы хотите быть уверены, что исходный код будет устойчивым к сохранению в любой ASCII-совместимой кодировке, вы можете закодировать строку, чтобы сделать ее более устойчивой (если она менее читабельна):

puts "\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe3\x83\xbb\xe4\xbb\x8a\xe6\x97\xa5\xe3\x81\xaf"

Однако! Запись в консоль сама по себе большая проблема. Кодировка, используемая для отправки символов на консоль, зависит от платформы. В Linux или OS X это UTF-8. В Windows это своя кодировка для каждой локали установки (как выбрано в «Язык для приложений, не поддерживающих Юникод» в записи панели управления «Региональные и языковые стандарты»), но это никогда UTF-8.Этот параметр - опять же ошибочно - известен как кодовая страница ANSI.

Таким образом, если вы используете японскую версию Windows, кодировка вашей консоли будет кодовой страницей Windows 932 (вариант Shift-JIS). В этом случае вы можете сохранить текстовый файл из текстового редактора, используя «ANSI» или явно «Japanese cp932», и когда вы запустите его в Ruby, вы получите нужные символы. Опять же, если вы хотите, чтобы исходный код выдерживал неправильное кодирование, вы могли бы экранировать строку в кодировке cp932:

puts "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd\x81E\x8d\xa1\x93\xfa\x82\xcd"

Но если вы запустите ее на машине с другой локалью, она выдаст другие символы. Вы не сможете писать на японском языке в консоли по умолчанию из Ruby в западной установке Windows (кодовая страница 1252).

(Хотя Ruby 1.9 значительно улучшает обработку Unicode, здесь он ничего не меняет. Это все еще основанное на байтах приложение, использующее функции ввода-вывода стандартной библиотеки C, а это означает, что оно ограничено локальной кодовой страницей Windows.)

12
ответ дан 5 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: