• ベストアンサー

EUCのデータファイルをShift_jisで読み込む方法

初めまして。 perlの知識は殆ど無く、見よう見まねで改造をするレベルです。 質問させて頂きたいのですが、 あるスクリプトにてEUCで保存(書き込まれた)されたデータファイルを、違うスクリプトにてそのデータファイルを読み込む際に、Shift_jisで読み込みたいのですが、どのような方法がありますでしょうか? それぞれのスクリプトを共通の文字コードで保存すれば良いのですが、データを保存する側のスクリプトでShift_jisにすると、"表"や"ー"などのデータが登録できなく、それの対処方法が解らなかった為、そのスクリプトとデータファイルをEUCで保存する事によって解決する事はできましたが、今度は別のスクリプトでそのデータファイルを読み込む必要があり、読み込む側ではShift_jisで保存されているスクリプトですので、文字化けが起こりデータファイルを読み込む事ができない状況です。 この読み込む側のスクリプトをEUCで保存をするのも検討しましたが、読み込む側のスクリプトが一つではなく複数ありますので、できればこれらはShift_jisのままで、データファイルを読み込む際に「Shift_jisに変換して読み込む」行為ができればと思い、質問させて頂きました。 ※具体的には会員登録用スクリプトとその登録されたデータファイルがEUCで保存されており、会員データファイルを読み込む全く別の掲示板などのスクリプトがShift_jisで保存されています。 もし宜しければご教授頂けますと幸いです。 宜しくお願い申し上げます。

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

  • ベストアンサー
  • perl2006
  • ベストアンサー率66% (2/3)
回答No.2

私も同じようなレベルなんですが、読み込んだデータをShift_jisに変換すればいいんじゃないでしょうか。 私の場合はこんな↓ふうにしています。 open(IN, $datfile); @lines = <IN>; close(IN); foreach $data (@lines) { &jcode'convert(*data, "sjis"); # シフトJISに変換 chop($data); ($name,$mail,$pass) = split(/$SP/,$data); ・・・・・ }

Ruffian
質問者

お礼

ご提示頂いた方法で希望通りの動作となりました! ご教授頂きまして有難うございました。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1>この箇所を open(IN, "<:encoding(euc-jp)", "$datfile"); とすれば良いのでしょうか? #1の方法の場合はそうです。 #1の方法の場合は、読み込んだデータをPerl の内部コードであるUTF-8に変換しています。 なので、以降の処理ではUTF-8(内部コード) だということを意識する必要があります。 #2の方法は、jcode.pm を使って読み込んだデータをeuc からshift_jis に変えるものです。 (perl5.8以降で)標準モジュールを使う場合は use Encode; Encode::from_to($data,"euc-jp","Shift_JIS"); とかします。 日本語コードをShift_JIS のままで扱うと不具合が生じる場合もあり、UTF-8(内部コード)で処理するようにすれば、そのような不具合を避けられて、Perl で2バイト文字を(特別扱いしなくても)普通の文字と同じように使えるようになるメリットがあります。

Ruffian
質問者

お礼

ご回答頂きまして有難うございます。 今回はNo2.様の手法で対処させて頂きましたが、UTF-8で処理するようにすれば問題も少なくなるとの事ですので、今後はこちらでの方法も勉強させて頂き対処できるようになりたいと思います。 ご教授頂きまして有難うございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

正確には「Shift_jisに変換して読み込む」ではないですが open(IN, "<:encoding(euc-jp)", "EUC.TXT"); で読み込んで open(OUT,">:encoding(Shift_JIS)","SJIS.TXT"); あるいは、 use Encode; … print encode("Shift_JIS",$str);#$str は、読み込んだ文字 の様に書き出せばいいです。

Ruffian
質問者

補足

有難うございます。 ただ、如何せん私のスキルでは理解できなくお恥ずかしい限りです。 open(IN, $datfile); @lines = <IN>; close(IN); foreach $data (@lines) { chop($data); ($name,$mail,$pass) = split(/$SP/,$data); ・・・・・ } 現状では上記のようなコードで「$datfile(登録データ)」を読み込むのですが、この箇所を open(IN, "<:encoding(euc-jp)", "$datfile"); とすれば良いのでしょうか? その後の処理の仕方も解っていない為、誠に申し訳ございませんがご教授頂けますと幸いです。

関連するQ&A