2

Perl Unicode FAQ 「デコードしないとどうなりますか?」の引用

エンコードされたバイナリ文字列がテキスト文字列と一緒に使用されるときは常に、Perl はバイナリ文字列が ISO-8859-1 (latin-1 としても知られる) でエンコードされていると想定します。Latin-1 でない場合、データは不愉快に変換されます。たとえば、UTF-8 の場合、マルチバイト文字の個々のバイトは個別の文字として認識され、再度 UTF-8 に変換されます。このような二重エンコーディングは、二重 HTML エンコーディング (>) または二重 URI エンコーディング (%253E) と比較できます。

この暗黙の暗黙のデコードは、「アップグレード」として知られています。ポジティブに聞こえるかもしれませんが、避けるのが一番です。

この暗黙のデコーディングを無効にすると、プログラマはdecode()/encode()を適切に使用せざるを得なくなり、バグの防止に役立ちます。

暗黙のデコードを無効にすることはできますか? 理想的には、バイナリ文字列をテキスト文字列と一緒に使用するとエラーが発生します。

4

1 に答える 1

2

私はその一節が嫌いです。Perl は、iso-8859-1 を使用して暗黙的に文字列をデコードすることはありません。まず第一に、Perl には文字列がデコードされたかどうかを知る方法がありません。

次の点を考慮してください。

my $num_apples = 4;
my $num_vegetables = $num_apples;

Perl は暗黙のうちに果物を野菜に変換しましたか? いいえ!では、以下で iso-8859-1 を使用して暗黙的にデコードされたと言うのはなぜですか?

my $bytes = "\x61\x62\x63\xE9";
$bytes =~ /♠/;

最初のスニペットでは、リンゴと思われるものを野菜として扱いました。2 番目のスニペットでは、バイトと思われるものを Unicode コード ポイントとして扱いました。

Unicode 文字の文字列を期待する関数があり、渡す場合

"\x61\x62\x63\xE9"

Unicode コード ポイント 0x61 は「a」、Unicode コード ポイント 0x62 は「b」などであるため、「abcé」として扱われます。デコードは行われません。おそらく、使用してその文字列を取得しました

decode('UTF-8', "\x61\x62\x63\xC3\xA9");

また

decode('iso-8859-1', "\x61\x62\x63\xE9");

しかし、まったく使用せずdecode、単純に始めたのかもしれません

"\x61\x62\x63\xE9"

また

read($bin_fh, $buf, 4)

これは、Perl が暗黙のうちに何かをデコードしたという意味ではありません。暗黙的なデコードは行われないため、オフにすることはできません。答えはノーだ。

于 2012-11-02T03:45:20.473 に答える