Perl
為什麼我的 Perl 不能很好地處理 Unicode?
在我的新 Arch 安裝中,
perl
Unicode 似乎不太好用。例如,給定這個輸入文件:ελα ρε 王小红
這個命令應該給我每行的最後兩個字元:
$ perl -CIO -pe 's/.*(..)$/$1/' file ε º¢
但是,正如您在上面看到的,我會胡言亂語。正確的輸出是:
ρε 小红
我知道我的終端 (
gnome-terminator
) 支持 UTF-8,因為它們都按預期工作:$ cat file ελα ρε 王小红 $ perl -pe '' file ελα ρε 王小红
不幸的是,沒有
-CIO
,perl
也不能正確處理文件:$ perl -pe 's/.*(..)$/$1/' file ε ��
它也不應該是語言環境問題:
$ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
我猜我需要安裝一些 Perl 包,但我不知道是哪些。一些相關資訊:
$ perl --version | grep subversion This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux-thread-multi $ pacman -Qs unicode local/fribidi 0.19.7-1 A Free Implementation of the Unicode Bidirectional Algorithm local/icu 55.1-1 International Components for Unicode library local/libunistring 0.9.6-1 Library for manipulating Unicode strings and C strings local/perl 5.22.0-1 (base) A highly capable, feature-rich programming language local/perl-unicode-stringprep 1.105-1 Preparation of Internationalized Strings (RFC 3454) local/perl-unicode-utf8simple 1.06-5 Conversions to/from UTF8 from/to characterse local/ttf-arphic-uming 0.2.20080216.1-5 CJK Unicode font Ming style
如何讓我的 perl 安裝與 Unicode 配合得很好?
您描述的問題是我測試過的系統上的標準行為。
I
並O
影響標準輸入和標準輸出,所以這應該工作:→ cat data | perl -CIO -pe 's/.*(..)$/$1/' ρε 小红
而這可能不會:
→ perl -CIO -pe 's/.*(..)$/$1/' data ε º¢
還有兩個選項可以
perl -C
產生您想要的行為。i 8 UTF-8 is the default PerlIO layer for input streams o 16 UTF-8 is the default PerlIO layer for output streams
這基本上是對 perl 說,使用文件打開形式:
open(F, "<:utf8", "data");
或者你可以使用
perl -CSD
which 是簡寫perl -CIOEio
S 7 I + O + E D 24 i + o
然後你得到
→ perl -CSD -pe 's/.*(..)$/$1/' data ρε 小红
如果
PERLIO
設置了環境變數並包含:utf8
此行為,則也將啟用。看起來預設行為
perl
在配置/編譯時也無法修改(下面的 cuonglm 評論)。Arch當然沒有設置任何東西。我懷疑 debian perl 軟體包會修改預設行為。