Как мне сделать Perl код DWIM с UTF8? - PullRequest
7 голосов
/ 17 февраля 2010

Прагма utf8 и кодировки utf8 на файловых дескрипторах меня смутили. Например, это, по-видимому, простой код ...

use utf8;
print qq[fü];

Для ясности, шестнадцатеричный дамп на "fü" равен 66 c3 bc, который, если я не ошибаюсь, является правильным UTF8.

Это печатает 66 fc, который не является UTF8, а Unicode или, возможно, Latin-1. Выключите use utf8, и я получу 66 c3 bc. Это противоположно тому, что я ожидал.

Теперь давайте добавим в файл-дескриптор pramgas.

use utf8;
binmode *STDOUT, ':encoding(utf8)';
print qq[fü];

Теперь я получаю 66 c3 bc. Но удалите use utf8, и я получу 66 c3 83 c2 bc, что не имеет никакого смысла для меня.

Как правильно сделать мой код DWIM с UTF8?

PS Моя локаль установлена ​​на "en_US.UTF-8" и Perl 5.10.1.

Ответы [ 2 ]

6 голосов
/ 17 февраля 2010

use utf8; утверждает, что ваш исходный код закодирован в UTF8. Добавляя

binmode *STDOUT, ':encoding(utf8)';
print qq[fü];

Вы просите, чтобы выходные данные скрипта были также закодированы в UTF8.

Если бы вы написали

print "f\x{00FC}\n";

вам бы не понадобилось use utf8;.

0 голосов
/ 17 февраля 2010

use utf8; просто указывает, что ваш исходный код (включая строковые литералы) находится в UTF-8. Вам также необходимо установить кодировку ваших входных и выходных потоков.

Возможно, вы хотите установить переменную PERL_UNICODE в вашей среде. Я установил его на SAL, который выглядит так:

  • S STDIN / STDOUT / STDERR - UTF-8
  • A @ARGV - UTF-8
  • L но только в стандарте UTF-8

См. PERL_UNICODE и опция -C in perlrun .

Вы также можете использовать open pragma для установки кодировки по умолчанию.

Если вы делаете это в модуле, который вы распространяете среди других, вы, вероятно, захотите

use open ':locale';

, поэтому он не будет неожиданно включать UTF-8 для людей, которые не используют локаль UTF-8.

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