1
4

1 に答える 1

1

これはコードのバグです。

LWP::Simple::get元のバイトを返しません (一部のエンコーディングで)、デコードされたテキスト (つまり、Unicode) を返します。get(バイトが返された場合、エンコーディングがわからないため、バイトをデコードする方法がわからないため、これは理にかなっています。)

コードポイント U+ 00f6get("http://localhost/wtf.txt")を含む文字列を返します。print次に、いくつかのバイトを STDOUT に書き込みます。それらのバイトは何ですか?それは、ファイルハンドルに現在設定されているエンコーディング層に依存します。デフォルトでは、これは Latin-1 と UTF-8 の奇妙な混合です (文字列の内部エンコーディングに依存することさえあります)。

UTF-8 出力を取得する場合は、binmode STDOUT, ":encoding(UTF-8)";最初に実行します。これにより、STDOUT に書き込まれるすべてのテキストが UTF-8 としてエンコードされます。

一方、エンコーディングを無視して、Web サーバーから受信したバイトのみを書き込みたい場合LWP::Simpleは、間違った選択です。LWP::UserAgent代わりに を使用して呼び出します$response->content。(内部でLWP::Simple::get使用します。)$response->decoded_content

2 番目の例の切り捨てはおそらくpack/が原因unpackであり、Unicode 文字列では意味がありません (バイト文字列、つまりすべてのコードポイント <= 255 を対象としています)。

于 2016-11-05T23:25:45.113 に答える