Как я могу выводить UTF-8 из Perl?

Я пытаюсь написать 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".

Ответ 1

use utf8; не включает выход Unicode - он позволяет вводить Unicode в вашей программе. Добавьте это в программу перед оператором print():

binmode(STDOUT, ":utf8");

Посмотрите, поможет ли это. Это должно сделать вывод STDOUT в UTF-8 вместо обычного ASCII.

Ответ 2

Вы можете использовать открытую прагму.

Например, ниже устанавливает STDOUT, STDIN и STDERR для использования UTF-8....

use open qw/:std :utf8/;

Ответ 3

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";

Ответ 5

Спасибо, наконец, получил решение не поместить 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

Ответ 6

Перенаправить вывод в текстовый файл и попробовать его в редакторе. Если он отображается нормально, тогда ваш терминал неисправен.

Ответ 7

сделайте в своей оболочке: $ env | grep LANG

Это, вероятно, покажет, что ваша оболочка не использует локаль utf-8.