Я пытаюсь написать Perl script, используя прагму "utf8", и получаю неожиданные результаты. Я использую Mac OS X 10.5 (Leopard), и я редактирую TextMate. Все мои настройки как для моего редактора, так и для операционной системы по умолчанию предназначены для записи файлов в формате utf-8.
Однако, когда я ввожу следующее в текстовый файл, сохраните его как ".pl" и выполнив его, я получаю дружественный "алмаз с вопросительным знаком" вместо символов, отличных от ASCII.
#!/usr/bin/env perl -w
use strict;
use utf8;
my $str = 'Çirçös';
print( "$str\n" );
Любая идея, что я делаю неправильно? Я ожидаю получить "Çirçös" на выходе, но вместо этого получаю "ir s".
use utf8;
не включает выход Unicode - он позволяет вводить Unicode в вашей программе. Добавьте это в программу перед оператором print()
:
binmode(STDOUT, ":utf8");
Посмотрите, поможет ли это. Это должно сделать вывод STDOUT
в UTF-8 вместо обычного ASCII.
Вы можете использовать открытую прагму.
Например, ниже устанавливает STDOUT, STDIN и STDERR для использования UTF-8....
use open qw/:std :utf8/;
TMTOWTDI, выберите метод, который наилучшим образом соответствует тому, как вы работаете. Я использую метод среды, поэтому мне не нужно об этом думать.
В среде :
export PERL_UNICODE=SDL
в командной строке :
perl -CSDL -le 'print "\x{1815}"';
или binmode:
binmode(STDOUT, ":utf8"); #treat as if it is UTF-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is UTF-8
или PerlIO:
open my $fh, ">:utf8", $filename
or die "could not open $filename: $!\n";
open my $fh, "<:encoding(utf-8)", $filename
or die "could not open $filename: $!\n";
или с открытой прагмой:
use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";
-CSDL
работал для меня, где только binmode
не работал.
SDL
подразумевается как с -C
и с PERL_UNICODE
. Также стоит упомянуть прагму use open ':locale'
, потому что она является эквивалентом -C
в сценарии и export PER_UNICODE=
. Любой из этих 3 даст вам поддержку UTF8 для всех входных и выходных потоков (файлов или stdin / stdout / stderr), при условии, что локаль вашей среды основана на UTF8. Наконец, чтобы также рассматривать исходный код как UTF8, use utf8;
Прагма.
Вы также хотите сказать, что строки в вашем коде - utf-8. См. Почему современный Perl предотвращает UTF-8 по умолчанию?. Поэтому установите не только PERL_UNICODE=SDAL
, но также PERL5OPT=-Mutf8
.
Спасибо, наконец, получил решение не поместить utf8:: encode весь код. Синтезировать и завершить для других случаев, таких как запись и чтение файлов в utf8, а также работает с LoadFile файла YAML в utf8
use utf8;
use open ':encoding(utf8)';
binmode(STDOUT, ":utf8");
open(FH, ">test.txt");
print FH "something éá";
use YAML qw(LoadFile Dump);
my $PUBS = LoadFile("cache.yaml");
my $f = "2917";
my $ref = $PUBS->{$f};
print "$f \"".$ref->{name}."\" ". $ref->{primary_uri}." ";
где cache.yaml:
---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml
сделайте в своей оболочке: $ env | grep LANG
Это, вероятно, покажет, что ваша оболочка не использует локаль utf-8.
Перенаправить вывод в текстовый файл и попробовать его в редакторе. Если он отображается нормально, тогда ваш терминал неисправен.