これらの3つのバージョンはすべて異なる動作をしますか?
use open qw( :encoding(UTF-8) :std );
use open qw( :encoding(UTF8) :std );
use open qw( :utf8 :std );
まず、:utf8
テキストをUTF-8としてマークするだけで、有効かどうかはチェックされません。詳細については、PerlMonksに関するこの投稿を参照してください。
:encoding
PerlIO、perlの拡張レイヤーですperldoc perliol
":encoding"はエンコーディングを使用します。PerlIO.pmはそれを見つける場所を「知っています」が、このレイヤーを利用可能にします。これは、次のように呼び出されるときに引数を取るレイヤーの例です。open($ fh、 "<:encoding(iso-8859-7)"、$ pathname);
他の2つの質問はFAQで回答されていますperldoc perlunifaq
「:encoding」と「:utf8」の違いは何ですか?UTF-8はPerlの内部形式の1つであるため、多くの場合、エンコードまたはデコードの手順をスキップして、UTF8フラグを直接操作できます。「:encoding(UTF-8)」の代わりに、単に「:utf8」を使用できます。これは、データがすでに内部でUTF8として表されている場合、エンコード手順をスキップします。これは、書き込み時の適切な動作として広く受け入れられていますが、無効なバイトシーケンスがあると内部の不整合が発生するため、読み取り時に危険な場合があります。入力に「:utf8」を使用するとセキュリティ違反が発生する場合があるため、代わりに「:encoding(UTF-8)」を使用してください。「decode」と「encode」の代わりに「_utf8_on」と「_utf8_off」を使用することもできますが、これは悪いスタイルと見なされます。特に「_utf8_on」は、「:」と同じ理由で危険な場合があります。
「UTF-8」と「utf8」の違いは何ですか?「UTF-8」が公式標準です。「utf8」は、Perlが受け入れるものを自由にする方法です。それほどリベラルではないものと通信する必要がある場合は、「UTF-8」の使用を検討することをお勧めします。リベラルすぎるものと通信する必要がある場合は、「utf8」を使用する必要があります。完全な説明はEncodeにあります。「UTF-8」は、内部では「utf-8-strict」として知られています。チュートリアルでは、utf8が実際に内部で使用されている場合でも、UTF-8を一貫して使用します。これは、区別が難しい場合があり、ほとんど関係がないためです。たとえば、utf8は、9999999などのUnicodeに存在しないコードポイントに使用できますが、それをUTF-8にエンコードすると、置換文字が取得されます(デフォルトでは、Encodeの「不正なデータの処理」を参照してください。これに対処する方法。)わかりました、主張する場合:「内部形式」はutf8であり、UTF-8ではありません。(他のエンコーディングでない場合。)
open
プラグマ(つまり、 )は、入力と出力use open
のデフォルトのPerlIOレイヤーのみを設定します。次のことを行います、:std
「:std」サブプラグマ自体は効果がありませんが、「:utf8」または「:encoding」サブプラグマと組み合わせると、標準ファイルハンドル(STDIN、STDOUT、STDERR)を変換して、入出力用に選択されたエンコーディングに準拠します。ハンドル。たとえば、入力と出力の両方が「:encoding(utf8)」になるように選択されている場合、「:std」は、STDIN、STDOUT、およびSTDERRも「:encoding(utf8)」にあることを意味します。一方、出力のみが「:encoding(koi8r)」に含まれるように選択されている場合、「:std」により、STDOUTとSTDERRのみが「koi8r」に含まれます。「:locale」サブプラグマは暗黙的に「:std」をオンにします。
上記のようにUnicode入力perlを受信するように標準ストリームを設定するサブプラグマ( open.pm:std
固有)も:utf8
同様です。
エヴァンはあなたの答えを持っているようです。将来の使いやすさについてはuft8::all
、「Unicodeをオンにする-すべて」を参照してください。