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 を対象としています)。