Próbuję napisać skrypt Perla przy użyciu pragmy „utf8” i otrzymuję nieoczekiwane rezultaty. Używam systemu Mac OS X 10.5 (Leopard) i edytuję za pomocą TextMate. Wszystkie moje ustawienia zarówno mojego edytora, jak i systemu operacyjnego są domyślnie ustawione na zapisywanie plików w formacie utf-8.
Jednak kiedy wprowadzam następujące polecenie do pliku tekstowego, zapisuję go jako „.pl” i wykonuję, otrzymuję przyjazny „romb ze znakiem zapytania” zamiast znaków spoza zestawu ASCII.
#!/usr/bin/env perl -w
use strict;
use utf8;
my $str = 'Çirçös';
print( "$str\n" );
Masz pojęcie, co robię źle? Spodziewam się, że na wyjściu pojawi się „Çirçös”, ale zamiast tego otrzymuję „ irçös”.
utf8
:Odpowiedzi:
use utf8;
nie włącza wyjścia Unicode - umożliwia wpisanie Unicode w programie. Dodaj to do programu, przed swoimprint()
oświadczeniem:Zobacz, czy to pomoże. To powinno dać
STDOUT
wyjście w UTF-8 zamiast zwykłego ASCII.źródło
Możesz użyć otwartej pragmy .
Np. poniżej ustawia STDOUT, STDIN i STDERR do używania UTF-8 ....
źródło
TMTOWTDI , wybierz metodę, która najlepiej pasuje do Twojego stylu pracy. Używam metody środowiskowej, więc nie muszę o tym myśleć.
W środowisku :
w linii poleceń :
lub z binmode :
lub z PerlIO :
lub z otwartą pragmą :
źródło
SDL
jest to implikowane zarówno w przypadku, jak-C
iPERL_UNICODE
.use open ':locale'
Pragma Warto również wspomnieć, ponieważ jest to równoważne-scenariusz-C
iexport PER_UNICODE=
. Każde z tych 3 zapewni obsługę UTF8 dla wszystkich strumieni wejściowych i wyjściowych (plików lub stdin / stdout / stderr), przy założeniu, że ustawienia regionalne twojego środowiska są oparte na UTF8. Wreszcie, aby traktować kod źródłowy również jako UTF8, użyjuse utf8;
pragmy.perl -Mutf8 -CSDL -e '...'
pozwala konsumować / wyprowadzać UTF-8, a także używać literałów UTF-8 wewnątrz,-e
np. dla folderu zeperl -Mutf8 -CASDL -pe 'y/āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜĀÁǍÀĒÉĚÈĪÍǏÌŌÓǑÒŪÚǓÙǕǗǙǛ/aaaaeeeeiiiioooouuuuüüüüAAAAEEEEIIIIOOOOUUUUÜÜÜÜ/'
Chcesz również powiedzieć, że łańcuchy w twoim kodzie to utf-8. Zobacz Dlaczego współczesny Perl domyślnie unika UTF-8? . Więc zestaw nie tylko,
PERL_UNICODE=SDAL
ale takżePERL5OPT=-Mutf8
.źródło
Dzięki, w końcu znalazłem rozwiązanie, aby nie umieszczać utf8 :: encode w całym kodzie. Aby zsyntetyzować i uzupełnić w innych przypadkach, takich jak zapis i odczyt plików w utf8, a także działa z LoadFile pliku YAML w utf8
gdzie cache.yaml to:
źródło
wykonaj w swojej powłoce: $ env | grep LANG
To prawdopodobnie pokaże, że Twoja powłoka nie używa ustawień regionalnych utf-8.
źródło