プロが教えるわが家の防犯対策術!

いつもお世話になっております。
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

A 回答 (2件)

質問内容を拝見すると、PHPの内部エンコードはUTF-8になっているようですね。


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

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

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

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

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

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

半角スペースに見えるが実は半角スペースじゃない文字ということでしょうね。

文字コードを16進で表示させてみてはどうでしょうか。

この回答への補足

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

補足日時:2009/12/28 20:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!