プロが教えるわが家の防犯対策術!

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文を分けるのは大変なので避けたいです。
何か文字化けしない回避策や、原因について考えられることがありましたら教えていただけると大変助かります。

A 回答 (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 したら良いかもです。

はずしてたらごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
試してみたところ、
$line = decode('UTF-8' , $line);
とすることで、文字化けしなくなりました!

UTF-8文字列でもUTF-8文字列としてdecodeするといいのですね。
ありがとうございました。

お礼日時:2007/07/11 01:03

多分utf8フラグの問題だと思います。


#2,3の方の回答にあるようにすれば大丈夫だと思いますが、

入出力がすべてutf8なら、今回はuse Encodeは必要ないです。
utf8フラグをつければいいだけなので
DBからとってきたデータ($stringとします)
に対して
utf8::upgrade($string);
をしてみてください。

一応念のための確認ですが

> print "テスト:";
> print "$a[0]";
> と書くと、文字化けせずに表示されます。

ここで
print utf8::is_utf8($a[0]);
としたときの出力はどうなっていますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました!

utf8::upgrade($string);
を試してみたのですが、症状は改善されませんでした。

>ここで
>print utf8::is_utf8($a[0]);
>としたときの出力はどうなっていますか?

こちらについて試してみたところ、何も出力されませんでした。

試しにutf8::upgrade($a[0]);
をしてみた後に、print utf8::is_utf8($a[0]);をすると
1が出力されました。
ただ、文字化けは依然として残っているようでした。

お礼日時:2007/07/11 01:06

こんにちは、#2です。



思いっきり間違ってました。

>UTF-8.txtに
>日本語
>と一行書いて、UTF-8N で保存。

じゃなくて、utf8.txt です。ファイル名を間違ってました。

あと、スクリプトももちろん UTF-8N で保存です。

すみません。
    • good
    • 0

Perl スクリプトのほうで、use utf8 とかは宣言していますか?

    • good
    • 0
この回答へのお礼

ありがとうございます。
スクリプトの冒頭で
use utf8;
は宣言しています。

DB側接続直後に
"SET NAMES utf8"
を投げることもしております。

お礼日時:2007/07/10 07:58

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