みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

日本語処理(文字コード)関係のエラーの対処法について

日本語処理(文字コード)関係のエラーの対処法について


・環境は、XAMPPを使用しています。
perl、phpの簡単なプログラム(hello worldのようなもの)を実行して動きました。

・asperlを文法チェックに使っています

-実行したいサンプルプログラム-

原文(「SPIDERING HACKS中のプログラム」)は下記のutf8がshiftjisです。が、utf8に変更しました


#!/xampp/perl/bin/perl
use strict;
use LWP::Simple;
use Encode;
use encoding 'utf8'; # 使用しているプラットフォームにあわせてください。
binmode(STDERR, ':raw :encoding(utf8)'); # 同上

my $id = shift @ARGV || '074'; # 引数の取得(デフォルトはニュージーランド)

# 外務省海外安全ホームページ
my $url = "http://www.anzen.mofa.go.jp/info/info4.asp?id=$id";

my $content = get($url);
die "$url を読み込めませんでした。" unless defined $content;

# $contentを読み込んで危険情報を確認する。
$content = decode('utf8', $content); # コンテンツのコード変換
$content =~ s/<!--(.*?)-->//gs; # HTML内のコメント削除
$content =~ / SELECTED>▼([^<]+)</; # 国名の取得
print "$1\n";
if ($content =~ /現在、危険情報は出ておりませんが、/) {
print " 危険情報は出ていません。\n";
} else { print " 危険情報が出ています!\n"; };
print " 詳細はhttp://www.anzen.mofa.go.jp/を見てください。\n";


ローカル環境で、asperlを使用して文法チェックを行うと、エラーはありませんでした。


ところが、ローカル環境で実行すると、

Cannot decode string with wide characters at C:/xampp/perl/lib/Encode.pm line 174.

というエラーが出ます。

これは、Encode.pm の 174行目で引っかかってている、ということでしょうか?

だとしても、対処法が分かりません。

日本語処理で問題が発生しているようなのですが…。

投稿日時 - 2010-10-19 10:07:39

QNo.6260252

暇なときに回答ください

質問者が選んだベストアンサー

Perl がどうとかではなく, 「行儀のいいサイト」なら文字コードをユーザーエージェントになんらかの方法で教えています.
だから 3 は「読み込んだ情報からなんとかする」 (普通は meta タグの情報を解析する?) かレスポンスヘッダを見る, 4 についてもレスポンスヘッダで文字コードを明示すれば OK かと.

投稿日時 - 2010-10-19 23:09:27

お礼

確かに、文字コードの指定を明示的に行っているサイトがありますね。
ありがとうございました。1歩前進しました。

投稿日時 - 2010-11-03 10:36:34

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

$content = decode('utf8', $content); # コンテンツのコード変換
これ、いらんかも

投稿日時 - 2010-10-20 22:32:12

お礼

ありがとうございます。参考になりました。

投稿日時 - 2010-11-03 10:40:52

ANo.1

decode しようとしている文字列は, 本当に UTF-8 ですか?

投稿日時 - 2010-10-19 11:11:45

お礼

ご回答ありがとうございます。

他サイトから情報を取得する際の文字コードについては、下記の設定をしなければならない気がするのですが。

1.Perlで作ったプログラム自体の文字コード。これは保存時の文字コードを選択で設定できます。
2.Perlプログラム内でブラウザ表示させる場合の文字コード。これは、プログラム内で設定できます。
3.取得する対象のサイトで使われている文字コード。
4.ブラウザで設定されている文字コード。閲覧者が設定するので、マチマチです。

3については、どのサイトも明示的に設定されているものなのでしょうか? Perlプログラム内で、どんな文字コードを使用していたとしても、汎用性のあるプログラムを作成することはできませんか?

4について。Perlプログラム内で出力時の文字コードを設定してしまった場合、ブラウザ上での設定とで衝突が起こりませんか? ブラウザの文字コードをPerlプログラムから強制的に変更できたとして、閲覧者が他のサイトを見に行った場合に、文字化けするようなことはないでしょうか?

このあたりが、いまいちよく分からず適切な対処法が分からないでいます。

ご回答の手段とは、プログラム内で変数から値を取り出すような方法で、確認すればいいということでしょうか?

投稿日時 - 2010-10-19 11:30:51

あなたにオススメの質問