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

Presented by Nishishi via Movable Type. Last Updated: 2022/03/25. 10:39:37.

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は書けません。(書くと投稿が拒否されますのでご注意下さい。)

※ご投稿頂いた内容は、掲載前に管理者が確認する設定にしている場合があります。たいていは数日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

著者紹介


にしし(西村文宏)

にししでございます。本書いたり記事書いたりしてます。あと萌えたり。著書5冊発売中です(Web製作系4冊+小説1冊)。著書や記事は「西村文宏」名義。記事は主にAll Aboutで連載。本の最新刊は2011年3月に発売されたライトノベルでございますよ。

Twitter:にしし/西村文宏
にしし/西村文宏 on facebook にしし/西村文宏 on mixi フォローはお気軽に!

にしし(西村文宏)連絡先
☕ コーヒーをおごる

著書一覧と詳細

にししふぁくとりー Sakura scope内限定での主要なカテゴリ

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