人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

下記perlスクリプトの、入力(ホームページ取得)と、テキスト出力(text.txt)を確実に、SHIFT_JISに指定したいのですがどの様にすれば良いでしょうか?

スクリプト(test.pl)の記述はUTF-8。
例になるURL('http://**************************')は常に、SHIFT_JISなので読み込みミスをしない様、SHIFT_JISを指定したい。
また、確実に、SHIFT_JISで保存を行いたい。
この2つの条件を満たすperlのスクリプトを教えてください。
宜しくお願い致します。

----test.pl------
#!/usr/local/bin/perl

$URL = 'http://**************************';
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
my $proxy = new LWP::UserAgent;
$proxy->agent('ua');
$proxy->timeout(60);
my $req = HTTP::Request->new('GET' => $URL);
my $res = $proxy->request($req);
my $content = $res->content;

#プログラミングをprogrammingに置換
$str = 'プログラミング';
use Encode qw(from_to);
from_to($str,"utf8","SHIFT_JIS"); #UTF8に変換

$content =~ s/$str/programming/g;

open(F,">text.txt");
print F $content;
close(F);

__END__


●質問者: TREEG
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:HTTP http:// open Perl print
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● haruo-31
●10ポイント

http://www.namazu.org/~tsuchiya/perl/perl-5.8.html

ここの上から20%位行ったところの記載に習って書くと、こんな感じですかね。

use utf8;
open(F, ">somewhat.txt") or die $!;
binmode F, ":encoding(sjis)";

print F "sjisになってるはずな文字列";

手元のUTF8なLinuxで確認した分ではちゃんとSHIFTJISでした。

◎質問者からの返答

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

この質問をさせていただいたのは、

use LWPを使い何度もホームページをダウンロードしますと、時々、間違いなく、SHIFT_JISのページにも関わらず、他の文字コードで保存されます。

つまりこれは、ダウンロード時、SHIFT_JIS以外に誤認したか、書き込み時(text.txt)、SHIFT_JISで保存されなかったかが原因だと思います。

そこで、入力、出力、どちらも、SHIFT_JISで行いたいと思っています。

また、当方の力不足により、勘違いが発生すると二度手間になりますので、お手数ですが回答いただく際は、コードの一部ではなく、現在のコードを書き変えての回答を宜しくお願い致します。


2 ● Craftworks
●60ポイント ベストアンサー

http://blog.livedoor.jp/dankogai/archives/51221731.html

以下のソースは utf8 で保存

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use LWP::UserAgent;
use Path::Class;

my $url = shift;
my $str = 'プログラミング';
my $ua = LWP::UserAgent->new;
my $res = $ua->get($url);
my $content = $res->decoded_content; # or Encode::decode('sjis', $res->content);

$content =~ s/$str/programming/g;
$content = Encode::encode('sjis', $content);

my $file = Path::Class::File->new('text.txt');
my $fh = $file->openw;
print $fh $content;
$fh->close;

decoded_content() は文字化けする場合があるので、content() を使って明示的に Encode::decode() で変換した方が良さそうですね。

http://blog.livedoor.jp/sasata299/archives/51212133.html

Path::Class が使えない環境なら open は3引数で使いましょう。

open my $fh, '>', 'text.txt' or die $!;
◎質問者からの返答

回答いただきありがとうございました。

これで安定動作しそうです。

>Path::Class が使えない環境なら open は3引数で使いましょう。

これは何故でしょうか?

補足いただけると幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ