こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでMySQLに入力した半角スペースが?になる

いつもお世話になっております。
PHP初心者なのですが質問させてください。
タイトルの通りPHPからMySQLへと流したデータの一部半角スペースが
半角のクエスチョンマーク(?)に勝手に変換され困っています。

色々他のサイトを見て回った結果
<?php
mb_internal_encoding("utf-8"); //内部文字コードを変更
mb_language("uni");
mb_http_input("auto");
mb_http_output("utf-8");
mysql_query("SET NAMES utf8");
(以下DB接続部は略)
?>
とし、my.iniに
skip-character-set-client-handshake
を加えました。

環境はXAMPPを使っており次の通りです。
よろしくお願いします。
# Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9
# MySQL クライアントのバージョン: 5.0.51a

投稿日時 - 2009-12-07 22:19:49

QNo.5505908

すぐに回答ほしいです

質問者が選んだベストアンサー

質問内容を拝見すると、PHPの内部エンコードはUTF-8になっているようですね。
私も同じくPHP(UTF-8)、MySQL(UTF-8)で同じような経験をしました。
詳しく検証したわけではないのですが、DBに投入する直前のform中のhidden属性の
inputのvalue値に「&nbsp;」が含まれている場合にこのような現象が起きるようです。
(その先でどのような加工を行っているかまでは時間がなく調査していないのですが…)
最終的にDBに投入される際に「&nbsp;」が 0xc2 0xa0 という半角空白に変換されていました。(普通の半角空白はUTF-8でも0x20です)

この「0xc2 0xa0」という半角空白はSJISに変換することのできないコードのようで、
それが「?」と表示されるようです。

html_entity_decode()のPHPのオンラインマニュアル(http://jp2.php.net/manual/ja/function.html-entity-decode.php)をみると、

「ISO-8859-1 では '&nbsp;' エンティティが ASCII コード 32 ではなく
  ASCII コード 160 (0xa0) に変換される」

とあるので、これが関係しているのかもしれません。

$sがDBに投入する文字列の場合、投入直前に以下のような処理を
入れれば大丈夫かもしれません。
----------------------
$sp = html_entity_decode('&nbsp;', ENT_QUOTES, mb_internal_encoding());
$s = mb_ereg_replace("[{$sp}]", ' ', $s);
----------------------

投稿日時 - 2010-03-25 09:47:45

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

半角スペースに見えるが実は半角スペースじゃない文字ということでしょうね。文字コードを16進で表示させてみてはどうでしょうか。

投稿日時 - 2009-12-07 22:29:48

補足

ご指摘頂いたとおりにバイナリエディタで開きましたが、ちゃんと%20でした。
phpMyAdminから登録すると?にならずに半角スペースで登録できるので、
手元にあるプログラムで何かが間違っていると思うのですが…。

投稿日時 - 2009-12-28 20:35:36

あなたにオススメの質問