Perl

為什麼我的 Perl 不能很好地處理 Unicode?

  • February 18, 2016

在我的新 Arch 安裝中,perlUnicode 似乎不太好用。例如,給定這個輸入文件:

ελα ρε
王小红

這個命令應該給我每行的最後兩個字元:

$ 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 配合得很好?

您描述的問題是我測試過的系統上的標準行為。IO影響標準輸入和標準輸出,所以這應該工作:

→ 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 -CSDwhich 是簡寫perl -CIOEio

S     7   I + O + E
D    24   i + o

然後你得到

→ perl -CSD -pe 's/.*(..)$/$1/' data
ρε
小红

如果PERLIO設置了環境變數並包含:utf8此行為,則也將啟用。

看起來預設行為perl在配置/編譯時也無法修改(下面的 cuonglm 評論)。Arch當然沒有設置任何東西。我懷疑 debian perl 軟體包會修改預設行為。

引用自:https://unix.stackexchange.com/questions/241077