- ベストアンサー
Windows環境でShift-JISテキストファイルを読み書きする方法とは?
- Perlを使用してWindows環境でShift-JISのテキストファイルを読み込み、UTF-8で書き込む方法についてわかりません。
- binmode STDOUT, ":utf8"; だけではエラーが発生しました。エラーの意味を理解することができませんでした。
- 詳しい方にサンプルプログラムを教えていただけると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問文に「binmode STDOUT, ":utf8";」と書いておられるので、リダイレクトを使用するのかなと想像しました。 <utf.pl> use open IN => ":encoding(cp932)"; binmode STDOUT, ":raw:utf8"; print <>; コマンドラインから以下のように打てば所望の結果が得られるのではと思います。 C:\>perl utf.pl sjis.txt >utf8.txt >No.2さんへ open時に、:rawを入れればbinmodeを省略できると思います。 open my $in, "<:encoding(cp932)", "sjis.txt"; open my $out, ">:raw:utf8", "utf8.txt"; print {$out} <$in>; close $in close $out;
その他の回答 (2)
- root139
- ベストアンサー率60% (488/809)
open でエンコードを指定すれば良いかと。 ------------------------------------------------------ use Encode; open(IN, "<:encoding(sjis)", "sjis.txt") or die "Can't open sjis.txt."; open(OUT, ">:utf8", "utf8.txt") or die "Can't open utf8.txt."; binmode(OUT); # 改行をLFのみにする為 while (my $line = <IN>) { print OUT encode('utf8', $line); # encode は utf8 フラグを外すため } close(OUT); close(IN); ------------------------------------------------------ print OUT encode('utf8', $line); は print OUT $line; としても動作しますが、警告が出ます。 改行コードの変更がなければ、binmode(OUT) も encode('utf8', ・・・) も要らないのですが・・・。 > Malformed UTF-8 character ・・・ スクリプト内にUTF-8として正しくない文字が有るというエラーです。 「use utf8;」を宣言しているにもかかわらず、UTF-8以外の文字コード(Shift_JIS等)でスクリプト自体が記述されている場合などに出ます。 スクリプト自体はUTF-8で書くのが無難です。
- YkazubonY
- ベストアンサー率30% (26/86)
use Jcode; $str="シフトJIS文字列"; &Jcode::convert(\$str, 'utf-8'); printf("%s\n", $str);
お礼
ありがとうございます。下記のようにするとできました。 できれば、Jcodeは速度が遅いイメージを持っているので使用したくないので、別の方法を教えていただければと思います。 use Jcode; $str="シフトJIS文字列"; &Jcode::convert(\$str, 'utf-8'); my $file = "temp.txt"; open $fh, '>', $file or die "Cannot open '$file': $!"; binmode $fh; print $fh $str."\n"; print $fh $str."\n"; close $fh;
お礼
参考になりました。 ありがとうございます。