Perl UTF-8 проблемы с локалью :: Maketext - PullRequest
1 голос
/ 14 декабря 2010

Рассказ:
Я столкнулся со странной проблемой с Locale :: Maketext. Что-то превращает немецкий умлаутс в кодировку ISO-8859-1 при использовании прагма "use utf8" в моем лексиконе.

Длинная история:
В моем веб-приложении все хранится в UTF-8:

  • база данных
  • файлы исходного кода
  • HTML-тип документа
  • и все остальное, насколько я могу сказать

Я использую Locale :: Maketext для L10N, и все мит-лексиконы определены в модулях Perl, которые хранятся в UTF-8 и "использовать utf8". Все протестированные до сих пор языки (например, pt, pl, fr, en, zh, ko и др.) Работают нормально, за исключением языка de. До тех пор, пока в лексиконе этого языка включено « use utf8 », что-то меняет немецкие умлауты (вероятно, все нет 7-битного ASCII) в ISO-8859-1. У меня есть скрипт, который проверяет, что все в моем исходном дереве закодировано в UTF-8 (конечно, включая 7-битный ASCII).

Позвольте мне повторить: Если я уберу прагму «use utf8» для модуля MyApp :: L10N :: de, получающуюся кодировку после использования maketext в , мое приложение будет UTF-8 что хорошо. Пока модуль использует utf8 , кодировка превращается в ISO-8859-1 , в то время как все другие языки работают. Я отчаянно пытаюсь выяснить, почему, поскольку это не совсем соответствует тому, что я читал о прагме utf8.

Мой вопрос прост: почему это происходит? Как мне исправить это поведение, т. Е. Как мне заставить мое приложение работать с использованием utf8 в all исходные файлы?

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Ошибка, с которой вы столкнулись, задокументирована в Locale :: Maketext :: Gettext :

Существенным преимуществом этого Locale :: Maketext :: Gettext по сравнению с оригинальным Locale :: Maketext (3) является то, что: GNU gettext является многобайтовым, но исходный код Perl - нет. […] Извините, что говорю это, но странно, что среда локализации не является многобайтовой.

Рекомендуется перейти с Maketext на решение на основе Gettext, см. rassie замечательная статья о рокализации: http://rassie.org/archives/247

0 голосов
/ 16 декабря 2010

Я нашел себе решение: настройка всего ввода и вывода на utf8 сработала.Perl сделал несколько глупых преобразований.

Я только что поместил это в самое начало моего скрипта:

binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...