Как я могу вывести UTF-8 из Perl? - PullRequest
102 голосов
/ 09 марта 2009

Я пытаюсь написать скрипт на Perl, используя прагму 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'.

Ответы [ 6 ]

152 голосов
/ 09 марта 2009

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

binmode(STDOUT, ":utf8");

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

82 голосов
/ 09 марта 2009

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

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

use open qw/:std :utf8/;
64 голосов
/ 21 апреля 2009

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";
1 голос
/ 12 августа 2014

Вы также хотите сказать, что в вашем коде есть строки utf-8. См. Почему современный Perl по умолчанию избегает UTF-8? . Так что установите не только PERL_UNICODE=SDAL, но и PERL5OPT=-Mutf8.

0 голосов
/ 02 февраля 2013

Спасибо, наконец-то есть решение не помещать 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
0 голосов
/ 09 марта 2009

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

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

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