- 締切済み
UTF-8で書かれたHTMLファイルをShift-JISのファイルに変換できない
#!/usr/bin/perl -w =begin comment OS: Windows XP Perl: Active Perl v5.8.8 スクリプトは「Shift-JIS」で書いています。 日本語処理関係で参考にしているのはもっぱらオライリージャパンの「Spidering Hacks」の付録の翻訳者 による日本語処理の解説です。 http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、use encoding 'shiftjis'; から use encoding 'cp932'; へ変更している以外は そこに書かれているやり方に従っていると思います。 UTF-8で書かれたHTMLファイルを「LWP::UserAgent」で取得し、それを Shift-JISコードで出力したいと思い以下のコードを実行したのですが、 以下のエラーが出てしまいました。 Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/usr/local/site/lib/LWP/Protocol.pm line 114. このエラーは何が原因なのでしょうか? =end comment =cut use strict; use LWP 5.64; use Encode; use encoding 'cp932'; # http://oshiete1.goo.ne.jp/qa3716434.html の回答に従い、'shiftjis'から'cp932'へ変更。 #use encoding 'shiftjis'; binmode(STDERR, ':raw :encoding(shiftjis)'); my $url = "http://www.audiounion.jp/bin/products/used/A0/-/-/"; my $browser = LWP::UserAgent->new; my $response = $browser->get( $url ); die "cannot get $url:", $response->status_line unless $response->is_success; my $content = Encode::decode('utf8', $response->content); print $content;
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- YkazubonY
- ベストアンサー率30% (26/86)
garbageというぐらいだから、(株)とかのゴミ文字(一文字)が変換できないという意味では? だとすると、黙って変換してくれるJcodeの方が良いと思う。 ゴミ文字は、黙って??になるべ。 (例) use Jcode; Jcode:convert(\$str, $ocode, $icode);
- sakusaker7
- ベストアンサー率62% (800/1280)
Spidering Hacksにあったサンプルスクリプトで、LWP(やそのほかのモジュール)と use encoding を組み合わせて使っているものってありましたっけ? encoding::warnings - Warn on implicit encoding conversions - search.cpan.org http://search.cpan.org/~audreyt/encoding-warnings-0.11/lib/encoding/warnings.pm に In other words, do not use encoding unless you are certain that the program will not deal with any raw, 8-bit binary data at all. ってあるように、このプラグマを使うのは非常に面倒が伴います。 出力をShiftJIS(cp932)にするのは自前でやるか、binmode を使って設定すればよいと思います。 スクリプトをShiftJISで書くのはオススメできないんですけどねえ。 スクリプトの中のリテラル文字列としてダメ文字が現れないのなら いっそ無指定でもいいと思います。
- sakusaker7
- ベストアンサー率62% (800/1280)
use encoding 'xxx' というのは、外部から入力があったときに 自動的に 'xxx' という文字コードから内部表現(フラグつきUTF-8)に 変換してくれるというものです。 ですから、想定している 'xxx' (今回の例ではcp932 (or shiftjis))以外の 文字コードが来ると、とんでもない変換をかますという結果になります。 また、自分のスクリプトで行った use encoding の影響はそこで取り込んでいる モジュールにも及びます。 その結果、モジュールの作り手の想定外の状況になる可能性があります。 質問にあるスクリプトを見る限りではuse encoding をする必要は ないような気がするのですがなぜしているのでしょうか?
補足
ご回答ありがとうございます。 「use encoding 'cp932';」 としているのは、 「print $content;」 で標準出力に出力する際に UTF-8 から Shift-JIS に変換 するため、 また、スクリプトを Shift-JIS で書いているためです。 「Spidering Hacks」という本の翻訳書の付録の村上雅章 さんの日本語処理の解説に従いました。