2012-02-29 16 views
18

Perl'de Unicode Duyarlı Tek Katmanları Yazmanın Doğru Yolu Nedir? açık yolu:Perl'de Unicode Duyarlı Tek Katmanları Yazma

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

... tür ilk görüşte üzerinde çalışmaya görünür, ancak bu sadece bir kaza olduğunu:

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

Sadece kullanarak: aşağıdaki örnekte görüldüğü gibi Unicode bayt olarak yorumlanır -C bayrak UTF-8'e STDIN/STDOUTvb yeterli değildir tek başına ayarlamak için:

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

... Çünkü şimdi -e'daki metin Unicode olarak yorumlanmadı.

$ perl -C -Mutf8 [...] 

cevap

16

Evet, utf8 pragma yüklenirken bir karakteri yerine ayrı byte olarak kaynak kodunda “” UTF-8 dizisini yorumlamak için gereklidir.

Perl -C komut satırı anahtarı ve utf8 pragma yerel bağımsızdır, ancak kabuğun echo komutu değildir.

+0

Ne demek 'echo' komutu yerel bağımsız değil? – 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

Ben Unicode

işlemek gerekiyorsa utf8::all kullanmak ister: - (yani, formda "*.UTF‑8" bir aklı başında LOCALE varsayarak) böyle

Yani bu gitmek yoludur

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

PS. -C kullanarak da AFAIK, çok özel bayrakları vermek gerek

+5

[ '(...) (herhangi bir sayı veya seçenek listesi izler değil) kendi başına -C' -CSDL'' aynı etkiye sahiptir.] (Http://p3rl.org/run#*-C-%5b_number%2flist_%5d*) – daxim

+0

İndirme nedeni nedir? (@daxim: bunu temizlediğiniz için teşekkürler) –

+0

Teşekkürler - bu modül kullanışlı görünüyor; yazık ki aynı etkiyi elde etmek için benzer şekilde basit ve açık bir şekilde yerleşik bir yol yoktur. –

0
Windows 7'de

:

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