Я намагаюся написати 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 за відповідь № 1use 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.