
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文を分けるのは大変なので避けたいです。
何か文字化けしない回避策や、原因について考えられることがありましたら教えていただけると大変助かります。
No.2ベストアンサー
- 回答日時:
こんにちは、
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 したら良いかもです。
はずしてたらごめんなさい。
ご回答ありがとうございます。
試してみたところ、
$line = decode('UTF-8' , $line);
とすることで、文字化けしなくなりました!
UTF-8文字列でもUTF-8文字列としてdecodeするといいのですね。
ありがとうございました。
No.4
- 回答日時:
多分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が出力されました。
ただ、文字化けは依然として残っているようでした。
No.3
- 回答日時:
こんにちは、#2です。
思いっきり間違ってました。
>UTF-8.txtに
>日本語
>と一行書いて、UTF-8N で保存。
じゃなくて、utf8.txt です。ファイル名を間違ってました。
あと、スクリプトももちろん UTF-8N で保存です。
すみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8でソースを書くとエラーに...
-
【文字コード】外見上は全く同...
-
MFCのコントロールにUTF-8の文...
-
文字コードの%E3%80%とは何です...
-
CSVファイルの中で、「 , 」カ...
-
VBA 文字に半角が含まれて...
-
フォントの色を保持したままセ...
-
エクセルで数値を全角文字(カ...
-
住宅にカナを入力する際に丁目...
-
データにカンマが入ったCSVデー...
-
CString から LPCTSTRの型に変換
-
COBOL・全角判定
-
EXCELからCSVにすると余計なカ...
-
「何とかで始まり、何とかで終...
-
VBA EXCEL あるセルの中の一...
-
「abcで始まらない」を正規表現...
-
「一角」って何でしょうか
-
16進数の文字列を文章に変える
-
IEからEdgeへの移行に伴うIMEの...
-
各項目がダブルクォーテーショ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCのコントロールにUTF-8の文...
-
perl でエラー:Wide character...
-
【LaTeX】pBibTeXでのエラーの...
-
【文字コード】外見上は全く同...
-
perlについての質問
-
pythonの文字コードとファイル操作
-
printfの書式指定での2バイト文...
-
UTF-16からUTF-8への変換
-
WindowsでUTF-8のPerlスクリプ...
-
jcode.plのかわり
-
Perlで、文字の出現回数を調べ...
-
Jcodeによるカタカナ→ひらがな変換
-
オブジェクト? perlをオーバー...
-
デバッグ情報が文字化けする
-
Perlにおけるパターンマッチ
-
カタカナ一覧表が知りたい
-
漢字コードについて
-
Encode と encoding の同時使用...
-
sedやperlでの2バイト文字を含...
-
perlのlwp::simpleのgetのprint...
おすすめ情報