2006年11月 7日(火) 22時58分29秒 [Perl/CGI]
UTF-8でのPerlプログラミングの謎…
UTF-8でのPerlプログラミングはよーわからん。(^_^;)
UTF-8が原因なのか、それとも、XML::Simpleが原因なのかは正確には分かりませんけど。でも、日本語文字列を含めなければうまくいくので、たぶんUTF-8が原因。
CGIで使うデータをXML形式のファイルに保存してます。で、そのファイルをXML::Simpleで読み書きすることで動くCGIを書いてます。がー。XMLに日本語を含めたときの挙動が謎すぎ。
ブラウザ上の入力フォームから日本語文字列を入力して、CGI経由でXMLファイルに出力すると...
- 初回の書き込みは問題なく行える。
- 2度目以降は、日本語文字列が文字化けする。(初回に書き込んだ日本語文字列は化けないまま正常。)
…という謎の現象が。
しかも、もっと不思議なのは、
- 文字化けしたデータを読んだ場合でも、文字化けしていないデータを読んだ場合でも、(CGI経由で)ブラウザ上で表示させた場合は、まったく文字化けしない。(^_^;)
ということ。
データファイル内に、「文字化けしている文字列」と「文字化けしていない文字列」が混在している以上、そのデータを読み込んでいるCGI上でも、どちらかが文字化けしても良さそうなもんなのに、どっちも文字化けせず正常に表示されるんですよね…。
でも、データファイルをテキストエディタで開くと、(2度目以降に出力した日本語文字列はすべて)文字化けしてるんですよね…。
データファイル(XML)をそのままブラウザで表示させてみても、やはりテキストエディタで開いた場合と同様に文字化けしています。
でも、CGI上での表示は正常…。
謎です。
CGI上で文字列を扱う処理に問題があるんだろうと思うんですけど、思いつくことはいろいろやってみたものの原因は分からず。(^_^;)
うがーっ。
で、いろいろ試行錯誤していると、次のようなことも分かりました。
- XML上で文字化けしていない日本語文字列のみを変数に読み込んで、それを、CGIソース中にダイレクトに記述された日本語文字列と結合させると、CGIソース中に書いた方の文字列だけが化ける。
- XML上で文字化けしている日本語文字列のみを変数に読み込んで、それを、CGIソース中にダイレクトに記述された日本語文字列と結合させると、まったく文字化けせずに正常に表示される。
ううーん。
で、Jcode.pmを使って、変数内の文字コードを調べてみると、さらによく分からんことに。
- XML中で、文字化けしている文字列を変数に取り込むと、文字コードは「utf8」だと判定される。
- XML中で、文字化けしていない文字列を変数に取り込むと、文字コードは「ascii」だと判定される。
…。(^_^;)
XMLファイル自身の文字コードは、UTF-8です。
謎だよなあ。逆だったら(=文字化けしてる方がasciiだと判定されるなら)分からんでもないのだけど。^^;;;
なんで、正常に読めている方(=UTF-8で書けていると考えられる)が「ascii」と判定されるんだろうか。^^;;;
PerlでUTF-8な文字列を扱う場合には、「UTF-8フラグ」というのが問題になるらしいです。で、「UTF-8フラグ」を落とすコードを書いてみたモノの、フラグを落としても落とさなくても現象に変化なし。
ううーん。そのコードが間違ってんのかなあ。
文字コードの問題さえなければ、わりと順調に開発進んでるんだけどなあああああ。(^_^;)
この日記へのコメントはお気軽に! コメント数:0 トラックバック数:0
| « CGIモジュールで、同じ名前の入力フォームの値を全部取得するには |
前後のエントリ < 旧 / 新 > | 長いURLを短くするリダイレクトCGI » |
このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)
コメント数: 0件