現在のページ

HOME » ID-Blogger » テクノロジー » トラブルシューティング » IEでフォームのGETが文字化けする場合

IEでフォームのGETが文字化けする場合

毎年の事ですがゴールデンウィーク返上でお仕事中ですw

ただいまPHPでWebシステム組んでいる所なんですが、GETで日本語を投げ込んだ際に、ブラウザがInternet Explorerだと文字化けするトラブルが発生!なんか前にも同じ症状で苦しんでなんとか解決した覚えが…と、昔のコードを漁ってなんとか思い出しましたw
メモ代わりと悩める同胞のために残しておきます。


CGIを組んだ際によくあるんですが、Shift_JISで「表」「予」「申」「能」「十」「ソ」といった特定の文字が文字化けしてしまう現象があります。ただし今回はHTTPヘッダはEUC-JPでガッチリ宣言してますので、どうもそういう問題ではないようです。

あくまでPHPでの表現になりますが、今回のパターンは

<?
$key = "お店";
echo "<a href=\"index.php?key=$key\">$key<a>";
?>
みたいなカンジで直接キーを入れたかったんですが、これを解決するには事前にURLエンコードしてしまってから吐き出すように
<?
$key = "お店";
$htmlencd = rawurlencode($key); ←ココでURLエンコードを挟む
echo "<a href=\"index.php?key=$htmlencd\">$key<a>";
?>
と改修いたしました。これで解決です♪

ちなみにFireFoxでは全然問題ありません。よくよく考えれば単純な問題なんですが、穴にはまっちゃうと…w

トラックバック

このエントリーのトラックバックURL:
http://www.infinity-dimensions.com/blog/mt-tb.cgi/225

コメント (4)

対策情報ありがとうございました。当方ではPHPとSQLiteを
組み合わせたデータベースを開発中で、本日、同じ問題に
遭遇しました。私もURLエンコードを試しましたが、
urlencode関数を使用したため、文字化けは直りませんで
した。この対策情報を利用させていただき、rawurlencode
関数に変更したところ、すぐに解決しました。ただ、なぜ
urlencode関数では駄目なのか、わかっていません。
注)当方では日本語エンコーディングはUTF-8で統一して
 います。

>黒田様
コメントありがとうございます。とりあえず解決されたようなので、微力ながらお役に立てて良かったですw
urlencode関数でダメだったのは、GETに投げたクエリ情報に半角スペースが含まれていたからではないでしょうか?

urlencode関数は半角スペースを"+"に変換するのに対して、rawurlencode関数は"%20"に変換する違いがあります。通常はrawurlencodeの方を使用するのが一般的なようです。
本来は「○○○.php?key=あああ いいい」というところを「○○○.php?key=あああ+いいい」とエンコードしてしまうのが原因で正常に稼動しないんだと思われます。

>芳賀様
詳しくご説明いただき、どうもありがとうございました。
1.今後はrawurlencode関数を使用するようにします。
 ◇PHP書籍の中には、urlencode関数しか記載されていないものがあります。
2.私が「urlencode関数で文字化けが直らなかった」と申しましたのでは、実はプログラムミスのようで大変申し訳ありません。
 1)該当個所が3個所あり、テストした個所とは別の所に適用していたようです(再確認できませんが)。あわてて色々テストしたため、うっかりしました。
 2)本ページの対策情報を拝見してrawurlencode関数を使用した際、最初に関数変換し、その変数を3個所とも適用するようにプログラム変更したため、すべてうまく行きました。
  ◇上記形式でurlencode関数を試験した結果、日本語2文字の間に空白を入れても、問題ありませんでした。
3.当方もFirefoxでは、URLエンコードの有無に関係なく、文字化けは全く生じていません。IEとFirefoxの両方に対応するため、時々余分な手間がかかります。
[備考]GETでやり取りする日本語は、検索のためのものです。その日本語入力を$keywordとしたとき、
 rawurlencode($keyword)のように関数変換しています。

>黒田様
行末を;で閉じるのを忘れたり、私もコーディングミスはしょっちゅうですw
ちなみに私の手持ちのテキストでは「通常はrawurlencode関数を使用する」と書かれておりました。

検索でURLエンコードを使用されるそうですが、urlencode関数を用いる場合は検索文字列として"+"を含まない事が前提になります。
フォームから任意に文字列が投げ込まれる場合など、純粋に"+"という文字を含んだ形で検索される可能性が捨てきれないパターンでは、やはりrawurlencode関数を使用するのが無難なようです。
そういう意味で「通常はrawurlencode関数」というのは合点がいくと思います。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

コンテンツメニュー

カテゴリー

Add