2012-02-29 29 views
18

Cách chính xác để viết một lớp lót nhận biết Unicode trong Perl là gì? Cách rõ ràng:ghi Unicode một-liners trong Perl

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

... kinda xuất hiện để làm việc trên cái nhìn đầu tiên, nhưng đây chỉ là một tai nạn: Unicode được hiểu như là byte như ví dụ tiếp theo cho thấy:

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

Chỉ cần sử dụng cờ -C để thiết lập STDIN/STDOUT, vv sang UTF-8 là không đủ bởi chính nó:

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

... bởi vì bây giờ văn bản trong -e không được hiểu là Unicode.

Vì vậy, đây là con đường để đi (giả sử một LOCALE lành mạnh - có nghĩa là, một trong các hình thức "*.UTF‑8") như thế này:

$ perl -C -Mutf8 [...] 

Trả lời

16

Vâng, tải utf8 pragma là cần thiết để giải thích các “” UTF-8 chuỗi trong mã nguồn như một nhân vật thay vì như byte riêng biệt.

Công tắc Perl -C dòng lệnh và utf8 pragma không phụ thuộc vào miền địa phương, nhưng lệnh echo của trình bao không phải.

+0

Bạn có ý nghĩa gì khi lệnh 'echo' không độc lập với miền địa phương? – tchrist

+0

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

7

Tôi thích sử dụng utf8::all nếu tôi cần phải xử lý unicode

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

PS. sử dụng -C bạn cũng cần phải cung cấp cho cờ cụ thể quá, AFAIK

+5

[ '-C' ngày của riêng mình (không theo sau bởi bất kỳ số lượng hoặc tùy chọn danh sách) (...) có tác dụng giống như' -CSDL'.] (Http://p3rl.org/run#*-C-%5b_number%2flist_%5d*) – daxim

+0

Lý do xuống hạng là gì? (@daxim: cảm ơn bạn đã xóa thông tin này) –

+0

Cảm ơn - mô-đun đó có vẻ hữu ích; tiếc là không có cách dựng sẵn tương tự đơn giản và rõ ràng để có được hiệu ứng tương tự. –

0

trong Windows 7:

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