PerlでのUTF-8 Shift-JIS あれこれ
PerlScriptをUTF-8で記述する場合、読み込み先ファイルがShift-JISの場合の文字化け問題や、そのままだとifの-fオプションが扱えなかったりと、色々と面倒です。
私の場合、ピンポイントに以下のコーディング方法について、調査に時間がかかったので、知識を共有します。
- 標準入出力・エラーをShift-JISにする
- WindowsのDOSコマンド、DIRの結果をパイプする
- ifで-fオプションを利用する
- Shift-JISで記述されたファイルを読む
- Shift-JISでファイルを書く
- UTF-8でファイルを書く
#!D:/usr/local/Perl/bin/Perl.exe use utf8; use Encode; print "Content-type: text/html\n\n"; print <<EOM; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>TEST</title> </head> <body> <pre> EOM # まだ標準出力がUTF-8なので、Shift-JISにエンコードしてます。 print Encode::encode('shiftjis',"--- このHTMLドキュメントはShift-JISです ---\n"); #*** # 標準入出力・エラー # 標準出力 UTF-8 -> Shift-JIS print Encode::encode('shiftjis',"◆標準出力をShift-JISにします。\n"); binmode STDOUT,':encoding(shiftjis)'; # 標準エラー UTF-8 -> Shift-JIS print "◆標準エラーをShift-JISにします。\n"; binmode STDERR,':encoding(shiftjis)'; # 標準入力 Shift-JIS -> UTF-8 print "◆標準入力をShift-JISで受け取り、UTF-8に変換します。\n"; binmode STDIN,':encoding(shiftjis)'; #*** #*** # ファイルの有無を検査 # Shift-JIS ( if(-f ***) ) -> UTF-8 (このScript) print "◆ファイルの有無を検査します。\n"; if(-f Encode::encode('shiftjis',"有無を確認するファイル.txt")){ print "有無を確認するファイル.txtは、あります。\n"; }else{ print "有無を確認するファイル.txtは、ありません。\n"; } #*** #*** # DIRコマンドの結果を取得し表示 # Shift-JIS (DIRコマンド) -> UTF-8 (このScript) -> Shift-JIS (標準出力) print "◆DIRコマンドの結果を取得し表示します。\n"; if(! open(fp,"DIR /B C:\\|")){ print "DIRコマンドが実行できませんでした。\n"; exit(1); } while(<fp>){ push(@line,Encode::decode('shiftjis',$_)); } close(fp); foreach(@line){ print $_; } #*** #*** # Shift-JISのファイル読み込み # Shift-JIS (sjis_in.txt) -> UTF-8 (このScript) print "◆Shift-JISのファイルを読み込みます。\n"; if(! open(in,"sjis_in.txt")){ print "sjis_in.txtを読めませんでした。\n"; exit(1); }else{ print "sjis_in.txtを読み込みました。\n"; } while(<in>){ push(@in,Encode::decode('shiftjis',$_)); } close(in); #*** #*** # Shift-JISでファイル書き出し # UTF-8 (このScript) -> Shift-JIS (sjis_out.txt) print "◆Shift-JISのファイルを書き出します。\n"; if(! open(out,">sjis_out.txt")){ print "sjis_out.txtを書けませんでした。\n"; exit(1); }else{ print "sjis_out.txtを書き込みました。\n"; } foreach(@in){ print out Encode::encode('shiftjis',$_); } close(out); #*** #*** # UTF-8でファイル書き出し # UTF-8 (このScript) -> UTF-8 (utf8_out.txt) print "◆UTF-8のファイルを書き出します。\n"; if(! open(out,">utf8_out.txt")){ print "utf8_out.txtを書けませんでした。\n"; exit(1); }else{ print "utf8_out.txtを書き込みました。\n"; } foreach(@in){ print out $_; } close(out); #*** print "おしまい"; print <<EOM; </pre> </body> </html> EOM exit(0);