- ベストアンサー
ソース中の文字列と、DBから取得した文字列を同時に表示すると文字化け
perl 5.8.6を使用しています。 MySQLから取り出したデータを、ソース中の文字列と同じprint文の中で 表示させようとした場合に文字化けしてしまいます。 文字コードはMySQL, ソースファイルともUnicode(UTF-8)を使用しています。 具体的には $a[0] にデータベースから取り出した文字列が入っているとすると、 ソース中で print "テスト:$a[0]"; とか print <<END_OF_TEXT; テスト:$a[0] END_OF_HTML とすると、$a[0]の部分が文字化けしてしまうのですが、 print "テスト:"; print "$a[0]"; と書くと、文字化けせずに表示されます。 ちょっと日本語を使ったり、データベースから取り出した文字列を使う箇所が多いプログラムなので、ひとつひとつprint文を分けるのは大変なので避けたいです。 何か文字化けしない回避策や、原因について考えられることがありましたら教えていただけると大変助かります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは、 MySQLは実験してませんが、外部からきたUTF-8な文字列のつもりで、 UTF-8.txtに 日本語 と一行書いて、UTF-8N で保存。 以下のスクリプトを実行すると、 #! /usr/bin/perl use 5.8.0; use strict; use warnings; use utf8; use Encode; open my $fh , '<' , "utf8.txt" or die; my $line = <$fh>; my $data = '日本語'; $line = decode('UTF-8' , $line); print encode 'shiftjis' , << "EOD"; 読み込んだデータは:$line スクリプト内で定義したデータは:$data EOD __END__ 読み込んだデータは:日本語 スクリプト内で定義したデータは:日本語 と表示されます。(ActivePerlなので print 時は shiftjisです。) >$line = decode('UTF-8' , $line); この行が無かったら文字化けします。 もしかしたら、MySQLから取得したデータを decode したら良いかもです。 はずしてたらごめんなさい。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
多分utf8フラグの問題だと思います。 #2,3の方の回答にあるようにすれば大丈夫だと思いますが、 入出力がすべてutf8なら、今回はuse Encodeは必要ないです。 utf8フラグをつければいいだけなので DBからとってきたデータ($stringとします) に対して utf8::upgrade($string); をしてみてください。 一応念のための確認ですが > print "テスト:"; > print "$a[0]"; > と書くと、文字化けせずに表示されます。 ここで print utf8::is_utf8($a[0]); としたときの出力はどうなっていますか?
お礼
ご回答ありがとうございました! utf8::upgrade($string); を試してみたのですが、症状は改善されませんでした。 >ここで >print utf8::is_utf8($a[0]); >としたときの出力はどうなっていますか? こちらについて試してみたところ、何も出力されませんでした。 試しにutf8::upgrade($a[0]); をしてみた後に、print utf8::is_utf8($a[0]);をすると 1が出力されました。 ただ、文字化けは依然として残っているようでした。
- g_p_
- ベストアンサー率53% (28/52)
こんにちは、#2です。 思いっきり間違ってました。 >UTF-8.txtに >日本語 >と一行書いて、UTF-8N で保存。 じゃなくて、utf8.txt です。ファイル名を間違ってました。 あと、スクリプトももちろん UTF-8N で保存です。 すみません。
- sakusaker7
- ベストアンサー率62% (800/1280)
Perl スクリプトのほうで、use utf8 とかは宣言していますか?
お礼
ありがとうございます。 スクリプトの冒頭で use utf8; は宣言しています。 DB側接続直後に "SET NAMES utf8" を投げることもしております。
お礼
ご回答ありがとうございます。 試してみたところ、 $line = decode('UTF-8' , $line); とすることで、文字化けしなくなりました! UTF-8文字列でもUTF-8文字列としてdecodeするといいのですね。 ありがとうございました。