#!/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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
garbageというぐらいだから、(株)とかのゴミ文字(一文字)が変換できないという意味では?
だとすると、黙って変換してくれるJcodeの方が良いと思う。
ゴミ文字は、黙って??になるべ。
(例)
use Jcode;
Jcode:convert(\$str, $ocode, $icode);
No.2
- 回答日時:
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で書くのはオススメできないんですけどねえ。
スクリプトの中のリテラル文字列としてダメ文字が現れないのなら
いっそ無指定でもいいと思います。
No.1
- 回答日時:
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」という本の翻訳書の付録の村上雅章
さんの日本語処理の解説に従いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時パラメータを使用するとE...
-
LCD ディスプレイを Raspberry ...
-
ArduinoのジャイロモジュールMP...
-
Excel VBAでリンク切れをチェッ...
-
モジュールとクラスの違いって...
-
VBAでoutlook365が起動しません。
-
Excel VBAで、ユーザーフォー...
-
Wordで、分かち書きをするVBA ...
-
Excel VBA 定義されたプロージ...
-
Excelで時刻になったら知らせて...
-
powershellで関数名を変更する...
-
グラフのX,Y座標を取得したい
-
vba 標準モジュールインポート...
-
例外処理のフローチャートの記...
-
COBOLで、Shellを起動するには?
-
Perl+DBD::Oracleのエラーがわ...
-
VB.NETでの他アプリケーション...
-
VBAのモジュールについて教えて...
-
Apache2 静的・動的モジュール...
-
BASP21使用のメール送信でコマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
bashのgrepで複数の検索、かつ...
-
エラー
-
Pod::Usageで日本語を使用する...
-
perlでactive directoryに登録
-
perlスクリプト s/^\\s+//; ...
-
perl+shiftjisで5c文字化けの対...
-
実行時パラメータを使用するとE...
-
UTF-8で書かれたHTMLファイルを...
-
XML::XPathで日本語検索するには
-
メールフォームからの受信メー...
-
何時間後を求める。
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
おすすめ情報