にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:22:54.

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フラグ」を落とすコードを書いてみたモノの、フラグを落としても落とさなくても現象に変化なし。
ううーん。そのコードが間違ってんのかなあ。

文字コードの問題さえなければ、わりと順調に開発進んでるんだけどなあああああ。(^_^;)

コメント

私も同じような経験があります。

挙動がロジカルとは思えなかったので、すべてバイナリ
で処理をして、文字コードの判定や、必要であればその
変換部分を自分で組むことにして解決しました。

究極的にはそういった方法しかないのだと思います。

投稿者 とおりすがり : 2011年09月04日 19:13

コメント数: 1件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---