Home > PHP > 『ソ』Shift-jisでformの文字化け

『ソ』Shift-jisでformの文字化け

shift-jisでform作成して、即MySQLとかDBに入れようとすると、文字化けたまま登録ささる。

文字化けの仕組み

何故文字化けが起きるかっていうと、
PHPでマルチバイト文字の誤認識をしてるからなのね。

PHPは親切にもformで送るとき、「"」「'」「\」みたいなんを、エスケープ文字『\』つけて「\"」「\'」「\\」として送ってくれる。
で、受取ったら今度は「"」「'」「\」に戻すために、『\』を自動的に消してくれる。

消してくれるのはいいんだけど、残念ながら通常的にはshift-jisの『マルチバイト』を考えてなかったのだ。

『\』をバイナリ化すると『\』は『5C』。
マルチバイトではこの『5C』が案外使用されているのだ。

1文字を構成するのが1バイトである半角の英字に対し、マルチバイト文字は2バイト以上で作られている。
日本語で言えば2バイト。

半角英字は『A』=『41』みたいに1つで現せるから、『5C』は明らかに『\』だけ。
でも
『あ』=『82 A0』みたいに2つバイトを持つマルチバイトの場合、『5C』を使っているのが『\』だけとは限らない。
※1バイト=8ビット。それを16進数で現すから、1バイト2桁数字が書かれてるんだけど、この辺わからん人は、勉強してきてね。


化け代表として「ソ」(83 5C)があるから、それで例えてみる。

[パ][ー][ソ][ナ][ル] は [83 70][81 5B][83 5C][83 69][83 8B]

PHPで『5C』が消されるから、その分詰められて、
マルチバイトの法則に乗っ取って再結合される。
[83 70][81 5B][83 83][69][83 8B]

結果
『パーャiル』
と表示されてしまうわけだ。


対処法

文字化ける文字に、『5C』つまり『\』を足しておく。

つまり以前『『ソ』Shift-jis』て記事でも書いたように、Shift-JISでformeから『ソ』は『ソ\』にしなきゃいけない。

[パ][ー][ソ][\][ナ][ル] = [83 70][81 5B][83 5C][5C][83 69][83 8B]

普通なんだけど、『5C 5C』(\\)だったら、『5C』を1個だけ削るのだ。
で、
残った文字でマルチバイト的に結合すると
[83 70][81 5B][83 5C][83 69][83 8B] で [パ][ー][ソ][ナ][ル]
おめでとう。

で、
こちら、イチイチ該当文字をモチモチやる必要はなく、
キチンとPHP側で設定を用意してある。

magic_quotes_gpcをONにしておくか
変換対象に『addslashes()』をしておくこと


変換対象に『addslashes()』

addslashes()は、PHP内で、マルチバイト的に上の現象が起こりそうだなぁという文字の後ろに『\』を付けてくれるのだ。
使い方は以下みたいな感じ。

if(isset($_REQUEST['なんつら']))
	$_REQUEST['なんつら'] = addslashes($_REQUEST['なんつら']);


magic_quotes_gpcをONにする

ONにすると$_GET、$_POST、$_REQUEST、$_COOKIEにaddslashes()がかかる状態になる。
ONに設定するには『php.ini』と『.htaccess』と『php内』と3つ方法がある。

『php.ini』でmagic_quotes_gpc設定

magic_quotes_gpc = On

『.htaccess』でmagic_quotes_gpc設定

php_value 'magic_quotes_gpc' 'on'

『php内』でmagic_quotes_gpc設定

ini_set('magic_quotes_gpc', 'on');

を先頭に記載。


magic_quotes_gpcがかかっているかわからないとき

サーバ管理者が自分じゃないとか、htaccessが置けないとか、そんなとき。

スラッシュつけたいとき

if (!get_magic_quotes_gpc()) {
	if(isset($_REQUEST['なんつら']))
		$_REQUEST['なんつら'] = addslashes($_REQUEST['なんつら']);
}

スラッシュ取りたいとき

if(ini_get(magic_quotes_gpc) == 1){
	if(isset($_REQUEST['なんつら']))
		$_REQUEST['なんつら'] = stripcslashes($_REQUEST['なんつら']);
}

magic_quotes_gpcは、受取る度にどんどん『/』付けちゃうぞ。


『配列』でスラッシュつけたいとき

if (!get_magic_quotes_gpc()) {
	function my_addslashes($val){
		return is_array($val) ?
			array_map('my_addslashes', $val) :
			addslashes($val);
	}
	if(isset($_REQUEST['なんつら']))
		$_REQUEST['なんつら'] = my_addslashes($_REQUEST['なんつら']);
}

『配列』でスラッシュ取りたいとき

if(ini_get(magic_quotes_gpc) == 1){
	function my_stripcslashes($val){
		return is_array($val) ?
			array_map('my_stripcslashes', $val) :
			stripcslashes($val);
	}
	if(isset($_REQUEST['なんつら']))
		$_REQUEST['なんつら'] = my_stripcslashes($_REQUEST['なんつら']);
}


因みに

if(ini_get(magic_quotes_gpc) == 1){

if (get_magic_quotes_gpc()) {

でもいいらしい。


※追記 @2009.11.26

if(ini_get(magic_quotes_gpc) == 1){

だとNOTICEエラー出るから、エラーログ残してるなら

if (get_magic_quotes_gpc()) {

を使うべき。

更新@2009.11.26 17:36
公開@2009.07.28 15:37


関連する投稿

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://qooga.jb-jk.net/wp/2009/07/%e3%80%8e%e3%82%bd%e3%80%8fshift-jis%e6%96%87%e5%ad%97%e5%8c%96%e3%81%91/trackback/
Listed below are links to weblogs that reference
http://qooga.jb-jk.net/wp『ソ』Shift-jisでformの文字化け from MOT:主にプログラム勉強メモ部屋

Home > PHP > 『ソ』Shift-jisでformの文字化け

Search
Option
  • Twitter
  • 絵板
Feeds
commercial
Mobile
Meta
Tag Cloud
TOP10
commercial

Return to page top