• ベストアンサー

utf-8のマシンでsjisのデータファイルを読込み、eucでファイルに出力する方法

utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したいのですが、どのようにすればよいでしょうか。プログラム実行前後に入出力ファイルを直接コード変換することは考えておらず、全て一つのプログラム内でやりたいと考えています。 &jcode'convertで変換するのかなと思っているのですが、読込み時・書き込み時のどちらでやるべきなのか、あるいは両方やるべきなのか分かりません。データには、「・」「I,II」などの特殊文字(?)が含まれているので、それらの文字で問題が起きないかなどもちょっと心配です。 また、&jcode'convertでeucに変換すれば、改行コードも一緒にCR+LFからLFに変換されるものでしょうか。 文字コードのことがよく分かっていないので、的外れな質問になっているかもしれませんが、ご教示願います。

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

perl プログラムを UTF-8 で書くなど、 内部コードを UTF-8 とするなら、入力時に UTF-8 に変換し、 出力時には UTF-8 から外部コードに変換することになります。 jcode'convert で変換してもよいですが、 Encode モジュールを使って明示的に変換するなら use utf8; use Encode; while( my $line = <> ) { $line =~ s/\x0D\x0A$//xms; my $utf8_line = decode('CP932', $line); # anything to do print encode('EUC-JP', $utf8_line), "\n"; } みたいな感じだし、PerlIO による自動変換を行うのなら use utf8; binmode STDOUT, ":encoding(EUC-JP)"; binmode STDIN, ":encoding(CP932)"; while(my $line = <>) { $line =~ s/\x0D\x0A$//xms; # anything to do print $line, "\n"; } みたいな感じです。 文字コードの変換と改行コードの変換は別物なので上の例や jcode'convert では改行コードは自動的には変換されません。 なお jcode'convert はかなり古い書き方になるため、使用されている jcode.pl は UTF-8 には対応していないかもしれません。 Jcode::convert(Jcode.pm) または Encode を使用された方が よいと思います。 また、中黒「・」やローマ数字「I」、「II」などでは問題は起きませんが、 外字である「かっこ株」や「まる1」などは正しく変換されません。

yuri_tti
質問者

お礼

分かりやすくご説明していただきありがとうございます。 t-okuraさんが書かれていたEncodeモジュールについて 自分でも調べてみました。 5.8からはこんなに便利なものがあるんですね。 家には実行環境がないので、明日試してみます。 本当にありがとうございました。

その他の回答 (1)

回答No.2

「utf-8のLinuxマシンで、sjis(改行コードCR+LF)のデータファイルを読込み、euc-jp(改行コードLF)でファイルに出力したい」 という要件を満たすためなら、nkf を使うのが、最も簡単かと思います。 コマンドラインから、 $ nkf --version と実行して、バージョンが表示されれば、nkf を使うことができます。 以下のように実行すれば、 sjis(改行コードCR+LF)のデータファイルを読込んで、 euc-jp(改行コードLF)で出力します。 $ nkf -SeLu data.txt > data_new.txt 元のファイルを残さずに上書きするなら、 $ nkf -SeLu --overwrite data.txt ってな感じで。

yuri_tti
質問者

お礼

具体的なコマンドイメージまで書いて下さいましてありがとうございます。 Linux初心者の私にとってはとても助かります。 nkfについて自分でも調べてみました。 Luオプションをつけると、改行コードも変更してくれるんですね。 文字コードに翻弄され、なかなかプログラミングが進まなかったのですが、これで先に進めそうです。 ありがとうございました。