- 締切済み
文字コードの迷宮に迷い込みました
言語がPHP(SJIS)でDBがMySQL(Unicode)の環境で運用しているページがあるのですが、文字コードの変換で謎が謎を呼び始めたので質問します。 (1)フォームからの保存で「ソ」の文字を保存するとDB上で「ソ\」になります。 →コード変換ミス(5c=\)で理解しました。 (2)「ソ\」で保存されたデータをフォームに呼び出すと「ソ\」と表示される。 →UTF8で「5C=\」だから?? (3)上記を回避したくPHPでstripslashesを追加してみると、「ソ」の表示が「メ」になってしまっている。 なぜこうなるのか??回避できないのか?? という点で不思議と謎につつまれているのですが、コメントお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tecinfo
- ベストアンサー率52% (32/61)
回答No.2
自分も先日、同じような問題に遭遇しました。 接続直後に mysql_query("SET NAMES binary"); を一行加えることで解決すると思います。 SJISの文字列をバイナリのデータとしてMySQLに渡します。 クエリ生成の段階でmysql_read_escape_string()などの関数できちんとエスケープしていれば、SQLインジェクションの問題は防げると思います。
noname#210617
回答No.1
PHPは素人ですが。 「ソ\」はSJISでは 835C 815F ですね。 でここからバックスラッシュ(ASCIIで5C)を取ると 83815F 8381はSJISでは「メ」、ASCIIで5Fは「_」(アンスコ)
質問者
お礼
コードの細かな説明ありがとうございます。 こう見ると必然なんですね。 困る事には変わりないのだけれど・・・。 後は解決策考えます!!
補足
ありがとうございます。 mysql_query("SET NAMES binary") ですが、DB接続後にすでに mysql_query("SET NAMES sjis") の記述があり、それを変更すると全ての文字が文字化けし、 追加するとエラーが発生します。 この場合どのように考えて処置すればいいでしょうか?