• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlをwindows環境でshift-jisのテキストファイルを読)

Windows環境でShift-JISテキストファイルを読み書きする方法とは?

このQ&Aのポイント
  • Perlを使用してWindows環境でShift-JISのテキストファイルを読み込み、UTF-8で書き込む方法についてわかりません。
  • binmode STDOUT, ":utf8"; だけではエラーが発生しました。エラーの意味を理解することができませんでした。
  • 詳しい方にサンプルプログラムを教えていただけると助かります。

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.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;

aakkiirraajp
質問者

お礼

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

その他の回答 (2)

  • root139
  • ベストアンサー率60% (488/809)
回答No.2

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で書くのが無難です。

参考URL:
http://www.rwds.net/kuroita/program/Perl_unicode.html
  • YkazubonY
  • ベストアンサー率30% (26/86)
回答No.1

use Jcode; $str="シフトJIS文字列"; &Jcode::convert(\$str, 'utf-8'); printf("%s\n", $str);

aakkiirraajp
質問者

お礼

ありがとうございます。下記のようにするとできました。 できれば、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;

関連するQ&A