- ベストアンサー
UTF-8フラグを外すと、日本語が化ける
- MySQLにPerlから登録させるプログラムを書いていて文字コードでハマってしまいました。HTMLからpostされたデータを登録しても、そのまま日本語で保存されるのですが、以前に書き出しておいたデータファイルから読み込んだ文字が文字化けしてしまいます。
- utf8フラグのあたりが怪しいのでは、、と思い調べたところ、postされた文字列はフラグなしのutf8、データファイルから読み込んだ文字列はフラグ付きのutf8でした。それならばと、utf8::decode($str);をしてみたのですが、フラグは取れたものの肝心の文字列が文字化けしています。
- この状態で、どうすれば化けさせずに登録させられるでしょうか?Perlのバージョンは5.8.8です。スクリプト自体もutf8です。もし分かる方がいらっしゃればご教授願えると嬉しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えーと、まだ状況がよくわかっていないのですが、 入力元が ・POSTされたデータ(cgiとかで取得したもの?) →化けない ・通常のファイル → 化ける ということですか? >postされた文字列はフラグなしのutf8、データファイルから読み込んだ文字列はフラグ付きのutf8でした。 パターンが逆ならなんの疑問もないんですが、ファイルからの読み取りや オープンの部分はどのような記述をされていますか?
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
>>・POSTされたデータ(cgiとかで取得したもの?) →化けない >>・通常のファイル → 化ける > >そうなんです。HTML上に出力すると双方とも化けないんですがねえ;; んー、どうも状況が把握しきれません。 入力源は ・外部からのPOST ・通常のファイル 出力先は ・HTML ・通常のファイル ・MySQL データベース ですか? > open FH, $self->{'filename'}; これはファイルに出力するときに、出力ファイルをオープンしているところですよね。 「HTML上に出力」というのはどのように行っていますか? また、入力はどのようにとってきているかを教えてください。 通常のファイルからとってくる場合は open 文をどのように書いているかもお願いします。 それから、スクリプトで use xxxx しているモジュールがあれば それを全部挙げてください。 use encoding 'xxx' はしていませんか?
お礼
三回にもわたって回答していただきありがとうございました。 ご指摘いただいた部分などから自分で調べ実験した結果、なんとか自己解決できました。 どうやら、utf8フラグがついている文字列とついていない文字列を一緒に扱った結果化けたということだったようです。 最初はそれでも化けたりしたんですが、結局、 >オープンの部分はどのような記述を ってあたりから、open周りが良くないのかなぁ、と思い調べ、ファイル入力部は open FH, ">:utf8", "$self->{'filename'}"; とすることで問題は解決しました。 >スクリプトで use xxxx している use utf8; use CGI; use DBI; use Encode; use JSON; use MYAPP::...(自作モジュール群) binmode STDOUT, ":utf8"; binmode STDIN, ":utf8"; てな感じです。 ともあれ、sakusaker7さんの一言一言から解決につながりました^^ ありがとうございます!
- sakusaker7
- ベストアンサー率62% (800/1280)
MySQLとのやり取りはモジュール使ってやってますか? であればその辺の情報もお願いします。 あとできれば以前作成したときと、現在使っているのとで バージョンに相違があるかとか。
補足
語弊があったようです; postされたデータと、ファイルのデータを読み込み、MySQLへinsertしています。 データファイル != レコード ..ですね;; MySQLとのやり取りにはDBIを使用しています。バージョンは登録時点から一貫して同じバージョンのMySQLを使用しているので大丈夫なはずです・・!
補足
>・POSTされたデータ(cgiとかで取得したもの?) →化けない >・通常のファイル → 化ける そうなんです。HTML上に出力すると双方とも化けないんですがねえ;; ファイルオープンは、専用のモジュールを作ってやり取りしていますが、 open FH, $self->{'filename'}; my $lines = ""; foreach (<FH>){ $lines .= $_; } close FH; こんな感じで取得・スカラ変数にまとめて、その後JSONで保存されたデータは JSON.pm でパースし、そうでないものは直接、オブジェクト内に保持し、アクセサでやりとりしています。 今回使ったのはJSONでパースされたデータです!