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

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

UTF-8なCGIで日本語が扱えないのでおかしいなと思ったら...

文字コードをUTF-8にしてCGIを作成してたんですけども、CGIで生成した入力フォーム(HTML)から日本語文字列を入力させると、必ず化けてしまう問題に遭遇。
ASCII文字に限定して入力させると、問題なくCGIは動作するので、入力部分の問題でしょう。実はとっても簡単な箇所のミスだったんですけど、なかなか原因が分かりませんでした。

このCGI、最初はSHIFT-JISで作ってたんです。
でも、XML::Simpleモジュールを使ってXMLを操作する上では、最初から全部UTF-8で扱ってる方が楽そうな気がしたので、途中でUTF-8に変えたんです。
最初は、「基本的にはSHIFT-JISで、XMLを扱うときだけUTF-8に変換」みたいなややこしいことをしかけたんだけど、「それなら最初からUTF-8にすればいいんでは…」と思って、全部UTF-8に書き換えたんですよね。

そんなことがあったので、何か文字列の扱い方がおかしいのかとか、エンコード関係の部分に問題があるのか?とか、余計なとこばっかり見ていたのでした。^^;;;

いろいろうなった結果、判明した原因は、とても簡単なとこ。

CGIからの出力に使っている文字コードはUTF-8なので、(CGIの出力結果を)ブラウザに表示させた場合も、エンコードの表示は「UTF-8」になっていなければなりません。
がー。
よく見ると、ブラウザは「西ヨーロッパ言語(ISO-8859-1)」で表示してました。

なるほど、多バイト文字を許さない文字コードだとして解釈すれば、当然、日本語文字列を使うと化けますね。そんな状態でフォームから入力された日本語文字列を扱うと、いろいろおかしなことになりそうです。

UTF-8で出力してるのに、ブラウザがISO-8859-1だと解釈しちゃった原因は...
CGIでヘッダを出力するときに、

$cgi->header( -type => "text/html" );

…とだけ書いていたため。(^_^;)
文字コードも付加しないとダメですね。

$cgi->header( -type => "text/html" , -charset => "UTF-8" );

…こうして、文字コードがUTF-8であるようにヘッダを出力すれば解決でした。(^_^;)

ううーん。
ずいぶんな時間を消費してしまった。^^;

コメント

コメント数: 0件

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

保存しますか?



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

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

トラックバック

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

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