• 締切済み

文字コードの迷宮に迷い込みました

言語がPHP(SJIS)でDBがMySQL(Unicode)の環境で運用しているページがあるのですが、文字コードの変換で謎が謎を呼び始めたので質問します。 (1)フォームからの保存で「ソ」の文字を保存するとDB上で「ソ\」になります。 →コード変換ミス(5c=\)で理解しました。 (2)「ソ\」で保存されたデータをフォームに呼び出すと「ソ\」と表示される。 →UTF8で「5C=\」だから?? (3)上記を回避したくPHPでstripslashesを追加してみると、「ソ」の表示が「メ」になってしまっている。 なぜこうなるのか??回避できないのか?? という点で不思議と謎につつまれているのですが、コメントお願いします。

  • PHP
  • 回答数2
  • ありがとう数1

みんなの回答

  • tecinfo
  • ベストアンサー率52% (32/61)
回答No.2

自分も先日、同じような問題に遭遇しました。 接続直後に mysql_query("SET NAMES binary"); を一行加えることで解決すると思います。 SJISの文字列をバイナリのデータとしてMySQLに渡します。 クエリ生成の段階でmysql_read_escape_string()などの関数できちんとエスケープしていれば、SQLインジェクションの問題は防げると思います。

getamato
質問者

補足

ありがとうございます。 mysql_query("SET NAMES binary") ですが、DB接続後にすでに mysql_query("SET NAMES sjis") の記述があり、それを変更すると全ての文字が文字化けし、 追加するとエラーが発生します。 この場合どのように考えて処置すればいいでしょうか?

noname#210617
noname#210617
回答No.1

PHPは素人ですが。 「ソ\」はSJISでは 835C 815F ですね。 でここからバックスラッシュ(ASCIIで5C)を取ると 83815F 8381はSJISでは「メ」、ASCIIで5Fは「_」(アンスコ)

getamato
質問者

お礼

コードの細かな説明ありがとうございます。 こう見ると必然なんですね。 困る事には変わりないのだけれど・・・。 後は解決策考えます!!

関連するQ&A

  • MySQL文字コード

    DB情報をHTMLで表示する場合に、mb_convert_encoding()で指定する文字コード MySQL5.1 PHP5 HTML - shift_jis MySQL の文字セット UTF-8 Unicode (utf8) MySQL の接続照合順序: ujis_japanese_ci フィールドの照合順序 ujis_japanese_ci PHPプログラムでDB情報取得後にSJISに変換 mb_convert_encoding($String, "SJIS", "●●●"); ●●●の文字コードを何を指定すればいいのかがわかりません。 EUCを書くとうまくいってるような気もしますが、なぜEUCでうまくいく のかもわかりません。 ご教授下さい。

    • 締切済み
    • PHP
  • Shift-JISの文字と改行コードについて

    TEXTAREAで入力した値をDBに対して、 .htmlspecialchars(mysql_real_escape_string(stripslashes($_POST["in3"])),ENT_QUOTES) の記述で保存した時、 文字化けコード(「ソ」「表」)が入っている場合に改行を行うと、 改行部に「\r」が文字として保存されてしまいます。 また、文字化けコードがない場合には「\r」は表示されず、 文字化けコードと改行までの間に半角英数字が入っていると「\r」は表示されません。 このような状態になる理由や回避方法についてコメントいただきたく思います。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字化け

    0x81AF U+FF0D # FULLWIDTH HYPHEN-MINUS [2000] unicodeからSJISに変換するプログラムを作っていますが、 上記のコードのみ、SJISでは表示されず、その原因がわかりません。 unicode「-」 SJIS「・」←と、なってしまう。 他の変換(全文字やったわけではありませんが)はうまくいっており、また、SJIS→unicodeへの変換をすれば元通り「-」の表示になります。考えられる原因はどんなものでしょうか? 環境 ・VC++6.0 ・Windows VISTA

  • SJIS→UTF-8の文字コード変換

    Perlで、SJISの16進で表記された文字があるのですが、それがうまく表示できません。 Unicodeの16進文字コードだとうまく表記できるのですが…。 以下がスクリプトです。 以下の場合だと。(句点)がSJISだと0x8142で、 その16進文字列を表示したいのですが、実行結果にあるエラーが出てしまいます。 Unicodeだと。は0x3002なのですが、うまく表示できています。 すみませんがよろしくお願いします。 ---------------------------------------- # このファイルの文字コードはSJIS # 改行コードはLF # # 。 SJIS 0x8142 # Unicode 0x3002 # use Jcode; use encoding "sjis"; $a = 0x8142; $a = Jcode->new($a, "sjis")->utf8; printf("句点の表示…%c\n",$a); printf("句点の表示…%c\n",0x3002); ---------------------------------------- 実行結果 "\x{8142}" does not map to shiftjis at test.pl line 14, <DATA> line 846. 句点の表示…\x{8142} 句点の表示…。

    • ベストアンサー
    • Perl
  • 文字コードの変換について

    現在、表示はPHPで文字コードはEUCで表示しています。 そのときには表示できるのですが、 表示したものを、SHIFT-JISにエンコードしてエクセルに表示するときに、文字コードの違いにより表示されないものがあります。 エンコードは $str = mb_convert_encoding($str, "SJIS", "auto"); と行っています。 EUCからSJISに変換するときに、何か特別なことを行う必要があるのでしょうか??

    • ベストアンサー
    • PHP
  • CakePHPでDBに入れる際文字化け

    お世話になります。 現在CakePHPで携帯サイトを作成しているのですが、 通常出力は問題ないのですが、 フォームからDBに入れる際に文字化けが起こります。 ■現在行っている設定 charset=SJIS ファイルの文字コード:SJIS CakePHPのdatabese.phpのエンコード設定:SJIS MySQL の文字セット: UTF-8 Unicode (utf8) ご教授よろしくお願いいたします。

    • 締切済み
    • PHP
  • VB6での文字コードダンプ

    VB6を使用して文字のダンプを取得したいのですが、UNICODE→SJIS変換しての バイト長を取得するものはよく見かけるのですが、全角文字の文字コードの取得法は、調べてはいるのですがなかなか見つかりません。 行いたいことは、全角の"あ"の場合、0x82、0xa0のように SJISでの1バイト毎の16進(10進でも可)の文字コードを 取得したいということです。 よろしくお願いします。

  • TeraPadの文字コード

    TeraPadの文字コードについて教えてください。 1. TeraPadで扱える文字コードは Shift-JIS、JIS、EUC、Unicode、UTF-8、UTF-8N の6種類あるようですが、このEUCとEUC-JPは 同じものですか? 2. Shift-JISで保存すると、TeraPadの下の部分に 表示される文字コードがSJISとなります。 これはShift-JISのことですか? 3. 短い文章では文字コードを誤認識する場合も あるようですが、どうしたら正しく認識 させられますか? 指定した文字コードで保存できず困っています。

  • MySQLの文字コードについて

    こんばんは。今、PHP+MySQLの勉強をしているのですが、PHPとMySQLをSJISで保存して接続をすると文字化けはしないのですが、他の文字コードだと一部文字化けをしてしまいます。 どうやったら、他の文字コードでも化けないようにすればよろしいのでしょうか?ちなみにPHPは5.2/Apache2.0/MySQLは5.0を使っておりmy.iniの文字コード設定はデフォルトでSJISにしています。 よろしくお願いします。

  • oracleの文字コードとlinuxサーバの文字コードが異なる場合、サ

    oracleの文字コードとlinuxサーバの文字コードが異なる場合、サーバからシェルまたはsqlplusでDBに接続し、spoolコマンドで指定したファイルに、SQLの実行結果や、PLSQLのDNMS_OUTPUTで出力した内容を保存すると文字化けしてしまいます。 これを回避するにはどうすればよいのか、ご教授下さい。 具体的な環境は、下記の通りです。 oracles:SJIS(NLS-LANGはSJIS系にしています) サーバUTF8 出来ればUTF8でファイルに出力したいのですが、無理なら最低でもSJISで出力させたいです。現在は、ftpでバイナリーダウンロードさせて秀丸などのエディターで見ても、どちらとも認識できない文字コードになっているようです。 なお、お客様側のサーバなので、DBやOSの文字コードを変えることはできません。