なし use utf8
Perlがと、文字列は1バイト文字のシーケンスとして解釈されます。これからわかるように、文字列には4バイトがあります。
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
最初の3バイトは文字を構成し、最後の1バイトは改行です。
への呼び出し print
これらの4文字をSTDOUT送信します。次に、コンソールはこれらの文字を表示する方法を決定します。コンソールがUTF8を使用するように設定されている場合、コンソールはそれらの3バイトを単一の文字として解釈し、それが表示されます。
utf8
モジュールを追加すると、状況が異なります。この場合、Perlは文字列を2文字として解釈します。
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
デフォルトでは、PerlのIOレイヤーはシングルバイト文字で動作していると想定しています。したがって、マルチバイト文字を印刷しようとすると、Perlは何かが間違っていると判断し、警告を出します。相変わらず、を含めることで、このエラーの詳細な説明を得ることができますuse diagnostics
。それはこれを言うでしょう:
(S utf8)Perlは、予期していなかったときにワイド文字(> 255)に遭遇しました。この警告は、I / O(印刷など)ではデフォルトでオンになっています。この警告を静める最も簡単な方法は、出力に:utf8レイヤーを追加することです(例:binmode STDOUT、 ':utf8')。警告をオフにする別の方法は、警告を追加しないことです 'utf8'; しかし、それはしばしば不正行為に近いです。一般に、ファイルハンドルをエンコーディングで明示的にマークすることになっています。openおよびperlfunc / binmodeを参照してください。
他の人が指摘しているように、マルチバイト出力を受け入れるようにPerlに指示する必要があります。これを行うには多くの方法があります(いくつかの例については、Perl Unicodeチュートリアルを参照してください)。最も簡単な方法の1つは、-CS
コマンドラインフラグを使用することです。これは、3つの標準ファイルハンドル(STDIN、STDOUT、およびSTDERR)にUTF8を処理するように指示します。
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicodeは大きくて複雑な領域です。これまで見てきたように、多くの単純なプログラムは正しいことをしているように見えますが、理由は間違っています。プログラムの一部を修正し始めると、すべてのプログラムを修正するまで状況が悪化することがよくあります。