2012-02-29 14 views
18

Jaki jest poprawny sposób pisania unlode-świadomych jednolinijkowych w Perlu? Oczywistym sposobem:pisanie Unicode-jednoelementy w Perlu

$ echo 'フーバー' | perl -lne 'print if /フ/' 
フーバー 

... trochę wydaje się działać na pierwszy rzut oka, ale to tylko wypadek: Unicode jest interpretowany jako bajty jako kolejny przykład:

$ echo 'フーバー != フウバー' | perl -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/'                     => 29 
フ?[??]バー[ ] { }フ?{??}バー 

Wystarczy za pomocą Flaga -C ustawić STDIN/STDOUTitp na UTF-8 nie jest wystarczająca sama:

$ echo 'フーバー' | perl -C -lne 'print if /フ/' 
[no output] 

... ponieważ teraz tekst w -e nie jest interpretowany jako Unicode.

więc jest to do zrobienia (zakładając sane miejscowego - to jest on w postaci "*.UTF‑8") tak:

$ perl -C -Mutf8 [...] 

Odpowiedz

16

Tak, ładowanie utf8 pragma jest zobowiązany do interpretowania „” UTF-8 sekwencji w kodzie źródłowym jako postać zamiast jako oddzielne bajtów.

Przełącznik wiersza polecenia Perl -C i pragma utf8 są niezależne od ustawień narodowych, ale komenda powłoki echo nie jest.

+0

Co masz na myśli, że polecenie 'echo' nie jest zależne od lokalizacji? – tchrist

+0

'$ LANG = ja_JP.sjis bash␤ $ echo -n フ | uniquote -b␤ ¥ x83t␤ $ echo -n フ | hex␤0000 83 74' vs. '$ LANG = de_AT.UTF-8 bash␤ $ echo -n フ | uniquote -b␤ \ xE3 \ x83 \ x95␤ $ echo -n フ | hex␤0000 e3 83 95' – daxim

7

Lubię używać utf8::all jeśli muszę obsługiwać Unicode

echo 'フーバー' | perl -Mutf8::all -lne 'print if /フ/' 

PS. stosując -C Należy również podać konkretne flagi zbyt AFAIK

+5

[ '-C' na własną rękę (nie następuje dowolny numer lub opcję listy) (...) ma taki sam efekt jak' -CSDL'.] (Http://p3rl.org/run#*-C-%5b_number%2flist_%5d*) – daxim

+0

Powodem zaniechania jest? (@daxim: dziękuję za wyjaśnienie) –

+0

Dzięki - ten moduł wygląda na użyteczny; Szkoda, że ​​nie ma podobnie prostego i jasnego wbudowanego sposobu, aby uzyskać ten sam efekt. –

0

w Windows 7:

chcp 65001 
perl -M"charnames':full'" -E "say qq{I \N{HEAVY BLACK HEART} PSGI.}"