重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

また、&jcode'convertでeucに変換すれば、改行コードも一緒にCR+LFからLFに変換されるものでしょうか。
文字コードのことがよく分かっていないので、的外れな質問になっているかもしれませんが、ご教示願います。

A 回答 (2件)

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」などは正しく変換されません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/03 23:06

「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

ってな感じで。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/03 23:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!