/ / Як я можу вивести utf-8 з Perl? - perl, unicode, utf-8

Як я можу вивести utf-8 з Perl? - perl, unicode, utf-8

Я намагаюся написати 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( "$strn" );

Будь-яка ідея про те, що я роблю неправильно? Я сподіваюся, що отримав "Чирчесь" у виводі, але замість цього я отримую " ir s".

Відповіді:

143 за відповідь № 1

use utf8; не вмикає Unicode вихід - це дозволяє вам вводити Unicode у вашій програмі. Додайте це до програми перед вашим print() заява:

binmode(STDOUT, ":utf8");

Подивіться, чи допоможе це. Це повинно зробити STDOUT вихід у utf-8 замість звичайного ASCII.


75 за відповідь № 2

Ви можете скористатись відкрита прагма.

Наприклад. нижче встановлює STDOUT, STDIN і STDERR, щоб використовувати utf-8 ....

use open qw/:std :utf8/;

59 для відповіді № 3

TMTOWTDI, вибрали метод, який найкраще підходить як ви працюєте. Я використовую метод навколишнього середовища, тому мені не доводиться думати про це.

В навколишнє середовище:

export PERL_UNICODE=SDL

на командний рядок:

perl -CSDL -le "print "x{1815}"";

або з бінмод:

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 для відповіді № 4

Ви також хочете сказати, що рядки у вашому коді utf-8. Подивитися Чому сучасний Perl за замовчуванням уникає utf-8?. Так встановити не тільки PERL_UNICODE=SDAL але також PERL5OPT=-Mutf8.


0 для відповіді № 5

Спасибі, нарешті, вийшло рішення не розмістити utf8 ::кодувати весь код. Для синтезу та завершення для інших випадків, наприклад, створення та читання файлів у 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

-3 для відповіді № 6

зробити у вашій оболонці: $ env | grep LANG

Це, ймовірно, покаже, що ваша оболонка не використовує локаль utf-8.