アプリ版:「スタンプのみでお礼する」機能のリリースについて

#!/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;

A 回答 (3件)

garbageというぐらいだから、(株)とかのゴミ文字(一文字)が変換できないという意味では?


だとすると、黙って変換してくれるJcodeの方が良いと思う。
ゴミ文字は、黙って??になるべ。
(例)
use Jcode;
Jcode:convert(\$str, $ocode, $icode);
    • good
    • 0

Spidering Hacksにあったサンプルスクリプトで、LWP(やそのほかのモジュール)と


use encoding を組み合わせて使っているものってありましたっけ?

encoding::warnings - Warn on implicit encoding conversions - search.cpan.org
http://search.cpan.org/~audreyt/encoding-warning …



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で書くのはオススメできないんですけどねえ。
スクリプトの中のリテラル文字列としてダメ文字が現れないのなら
いっそ無指定でもいいと思います。
    • good
    • 0

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」という本の翻訳書の付録の村上雅章
さんの日本語処理の解説に従いました。

補足日時:2008/01/28 23:11
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!