• 締切済み

cgi出力での文字コードについて

下記のソースをsjisで作っていて、出力するdata.txtをuft-8で保存したいです。 どのようにすればよいでしょうか? 下記ソースでは、data.txtはsjisになっています。 尚、htmlはsjisなのでそのまま使用したいです。 どなたか教えてください。 宜しくお願いします。 ############################# #!/usr/local/bin/perl require 'jcode.pl'; require 'cgi-lib.pl'; &ReadParse; $datafile='data.txt'; ←これの保存のみutf-8にしたい open(FH,">$datafile"); print FH "$in{'name'}"; close(FH); rint "Content-type:text/html\n\n"; print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>"; print "<html><head></head><title>テスト</title><body>\n"; print "<center>入力完了しました。</center><hr /><br>\n"; print "<b>名前:</b>$in{'name'}<br>\n"; print "<hr />\n"; print "</body></html>";

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

何もしなければ、Perlは書いたままの文字を、バイト列として出力します。 たとえば、「 print "テスト" とShift_JISであれば print "\x83\x65\x83\x58\x83\x67" と同じです。 これを受けとった側で、Shift_JISとして解釈すると、 テスト になり、別の文字コードとして解釈すると「文字化け」になります。 これと同様に、UTF-8のバイト列にしたものを出力すれば、UTF-8の文字列になります。 $datafile='data.txt'; open(FH,">$datafile"); print FH UTF8に変換した$in{'name'}; close(FH); という感じに。 ただ、一般に出まわっているjcode.plはUTF-8に対応していません。 最近のPerlならEncodeモジュールを使って変換します

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

あまりにも無茶な注文です。 jcode.plはUTF-8には対応していません。 use:jcode; でjcode.pmならUTF-8が扱えます。  また、標準ライブラリのencode.pmでも良いです。 もちろん、printする前にUTF-8に変更しておかないと print FH "$in{'name'}"; だけじゃダメです。 HTML出力の間違ってます。 <meta>は<head>内で、かつ日本語が登場するより前でないとなりません。 >下記のソースをsjisで作っていて、  詳細は省きますが、それは、Perlでは禁忌です。少なくともeuc-jpでプログラムを書かないと深刻なトラブルに合います。今動いているのは偶然です。  最近のperlはUTF-8が使用できますので、そのままUTF-8で書くほうが楽です。

回答No.1
katsuo2011
質問者

補足

ありがとうございます。 もちろん検索して調べてみましたが、出力のみutf-8にするといった情報が少なく、あるにはあったのですが同じようにしてもエラーになってしまいました。 上記ソースで行いたいのでよろしければお教えいただけると幸いです。

関連するQ&A