ファイル名エンコーディングは、 プラットフォーム特有のものではなく、 ファイルシステム特有のものであることにも言及する価値があります 。
あるファイル名をエンコードして書き込むことができるという理由だけで、同じファイル名を読み込みしようとしたときにも同じことが起きると想定することは、決して完全に安全ではありません。
たとえば、UnicodeをサポートしていないFAT16
などのファイルシステムに書き込む場合、ファイル名は暗黙のうちにASCII互換の形式に変換されます。
しかし、それは他の呼び出しによって照会すると、同じことを呼ばれます例えば、読み、明示的な名前付けによってへの書き込み、ファイルが作成できることを前提としても、 あまり安全であるreaddir
あなたがして、指定よりも、あなたのファイル名に別のバイトを返すことがありますopen
。
VAXのようないくつかのシステムでは、OSによってファイル拡張子が変更される可能性があるので、 readdir
がfoo.bar
ようなファイル名に対してopen
で指定したのと同じファイル名を返すと常に考えることさえできません。
また、UNIXでは、 /
と\0
だけを除いて、OSが許すファイル名には、非常に自由な一連の合法的な文字があります.Windowsでは、ファイル名で禁止されている特定の文字の範囲があり、
ここでは十分な注意を払ってください。もしあなたが選択肢があるならば、ファイル名での巧妙なトリックを避けてください 。そして、常にあなたが使っている巧妙な技が一貫していることを確認するテストがあります。
CPAN
向けのコードを記述している場合など、コントロール外のプラットフォームで実行されるコードを書く場合は、 2倍の注意を払ってください。ユーザーベースの少なくとも5%は、選択、事故、またはコントロール外の権限によって、古代または壊れたテクノロジーが発生し、それらがバグを作成するために共謀することになります。
UTF-8はPerlで文字列を表現するための内部形式の1つであるため、エンコード/デコードのステップをスキップすることがよくあります。 :encoding(utf-8)
代わりに、あなたのデータが既にUTF-8である場合は:utf8
使うだけでよいの:utf8
。 :utf8
は出力ストリームでは安全に使用できますが、入力ストリームでは無効なバイトシーケンスがあると内部の不整合が発生するため危険です。また、 :utf8
を入力に使用するとセキュリティ違反が発生する可能性があるため、 :encoding(utf-8)
が推奨されます。
Perl v5.8.7
、 "UTF-8"
(ダッシュ付き)は、厳密でセキュリティに配慮した形式のUTF-8を意味します。一方、 "utf8"
は自由で自由な形式のUTF-8を意味します。
例えば、 "utf8"
は0xFFFFFFFF
ようにUnicodeに存在しないコードポイントに使用できます。これに対応して、 "\x{FE}\x{83}\x{BF}\x{BF}\x{BF}\x{BF}\x{BF}"
ような無効なUTF-8バイトシーケンスは、無効なユニコード(しかし、有効なPerlの)コードポイント( 0xFFFFFFFF
)使用して"utf8"
、一方で"UTF-8"
エンコーディングが有効なUnicodeの範囲外のコードポイントにデコードすることができないだろうし、あなたの置換文字(与えるだろう0xFFFD
代わりに)。
コード名は大文字小文字を区別しないので、 "UTF8"
同じである"utf8"
(すなわち、 非厳密変異体)。
詳細: UTF-8対UTF8対UTF8
PerlのUnicode処理の詳細は、次のソースで詳しく説明されています。
stackoverflow.comからの投稿(警告:最新のものではない可能性があります):
ユーチューブの動画: