/ / Jak mogę wyprowadzić utf-8 z Perla? - perl, unicode, utf-8

Jak mogę wyprowadzić utf-8 z Perla? - perl, unicode, utf-8

Próbuję napisać skrypt Perl przy użyciu"utf8" pragma, a ja uzyskuję nieoczekiwane rezultaty. Używam Mac OS X 10.5 (Leopard) i edytuję TextMate.Wszystkie moje ustawienia dla mojego edytora i systemu operacyjnego są domyślnie zapisywane w plikach format utf-8.

Jednak, gdy wprowadzę poniższe do pliku tekstowego, zapiszę go jako ".pl" i wykonam go, otrzymam przyjazny "diament ze znakiem zapytania" zamiast znaków spoza ASCII.

#!/usr/bin/env perl -w

use strict;
use utf8;

my $str = "Çirçös";
print( "$strn" );

Każdy pomysł, co robię źle? Spodziewam się uzyskać "Çirçös" w wyniku, ale zamiast tego otrzymuję " ir s".

Odpowiedzi:

143 dla odpowiedzi № 1

use utf8; nie włącza Unicode wydajność - umożliwia wpisanie kodu Unicode w swoim programie. Dodaj to do programu, przed swoim print() komunikat:

binmode(STDOUT, ":utf8");

Sprawdź, czy to pomaga. To powinno zrobić STDOUT wyjście w utf-8 zamiast zwykłego ASCII.


75 dla odpowiedzi № 2

Możesz użyć otwarta pragma.

Na przykład poniżej ustawia STDOUT, STDIN i STDERR, aby użyć utf-8 ....

use open qw/:std :utf8/;

59 dla odpowiedzi nr 3

TMTOWTDI, wybrałeś metodę, która najlepiej pasuje do Twojej pracy. Używam metody środowiska, więc nie muszę o tym myśleć.

w środowisko:

export PERL_UNICODE=SDL

na wiersz poleceń:

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

lub z Tryb bin:

binmode(STDOUT, ":utf8");          #treat as if it is utf-8
binmode(STDIN, ":encoding(utf8)"); #actually check if it is utf-8

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

lub z otwarta pragma:

use open ":encoding(utf8)";
use open IN => ":encoding(utf8)", OUT => ":utf8";

1 dla odpowiedzi nr 4

Chcecie również powiedzieć, że łańcuchy w kodzie są utf-8. Widzieć Dlaczego współczesny Perl domyślnie unika utf-8?. Tak więc ustaw nie tylko PERL_UNICODE=SDAL ale również PERL5OPT=-Mutf8.


0 dla odpowiedzi № 5

Dzięki, w końcu otrzymaliśmy rozwiązanie, aby nie wstawiać utf8 ::koduj cały kod. Aby zsyntetyzować i wykonać dla innych przypadków, takich jak zapis i odczyt plików w utf8, a także współpracuje z LoadFile pliku YAML w 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}." ";

gdzie cache.yaml jest:

---
2917:
id: 2917
name: Semanário
primary_uri: 2917.xml

-3 dla odpowiedzi № 6

zrób w twojej powłoce: $ env | grep LANG

To prawdopodobnie pokaże, że twoja powłoka nie używa ustawień narodowych utf-8.