[PHP-users 14281] Re: getでの文字コード対策

Osamu Shigematsu php-users@php.gr.jp
2003年 3月 25日 (火) 07:00:05 JST


重松です。こんにちは。

> 呼び出したURLと変数の値、
> 
>   fncGetAdr.php?txtAddress1=福岡市博多区博多駅前
> 
> fncGetAdr.phpが受け取った値、
> 
>   echo $txtAddress1;
>   福岡市縛淇区縛淇駅前
> 
>   echo var_dump(unpack('H*',$_GET['txtAddress1']));
>   array(1) { [""]=> string(40)"caa1b2acbbd4c7fbdebfb6e8c7fbdebfb1d8c1b0" } 
> 
> となりました。

福岡市博多区博多駅前 を EUC で保存して od -tx1 で dump をとったら、

0000000 ca a1 b2 ac bb d4 c7 ee c2 bf b6 e8 c7 ee c2 bf
0000020 b1 d8 c1 b0 0a
0000025

となりました。
# 最後の 0a は LF です。vi が勝手にくっつける。:)

で、比べてみると、

ca a1 b2 ac bb d4 c7 ee c2 bf b6 e8 c7 ee c2 bf b1 d8 c1 b0
ca a1 b2 ac bb d4 c7 fb de bf b6 e8 c7 fb de bf b1 d8 c1 b0
                     ^^ ^^             ^^ ^^
の部分が化けてますが、あんまり規則性がわかりませんね。これだけだと。

いずれにしても、GET で URL に埋め込む形でマルチバイト文字をそのまま渡すと、
文字化けしてしまうので、上記の規則性から文字化けの理由を突き止めて、
それが PHP 側の問題ならば、対処できる可能性もありますが、
ブラウザの問題 (UTF-8 に変換して送るようになっているものが多いが、
結局ばらばら) ならお手上げなので、以下のような対策はどうでしょうか。

(1) URL エンコード + 最初の 2 文字を美乳にして、
受け取ったデータの頭 4 バイトを捨てる。
# 美乳は別に他意はありません。:)
# http://ns1.php.gr.jp/pipermail/php-users/2003-March/014298.html

(2) 16進数にしてしまう。PHP 側は、pack() でもとに戻せます。

-- 
Osamu Shigematsu <m5issige@mr.hitachi-medical.co.jp>





PHP-users メーリングリストの案内