• ベストアンサー

SJISからUTFに変換してのDB登録がある文字だけうまくいかない。

PHPとPostgresでデータベース構築中の初心者です。宜しく御願いします。 今現在なんとかSJIS(windows)からUTF(linux)へ文字コードを変換してDBへデータを入力できるようになり、テスト中なのですが、問題が発生しました。 データがある文字で終わる場合のみデータ追加ができない、という問題です。 今分かっているのは、「表」という文字です。 しかも、文字列の最後に来た場合のみエラー(SQLでINSERTできない)がでます。 例えば、「方針発表」と入力した場合、エラーですが、 「方針発表出席」と入力すればデータ追加可能です。 いろいろ調べている途中ですが原因、解決策ともにまだ不明です。 どなたか御教授願います。 ちなみに、文字コード変換は次の関数cnvで行っております。 function cnv($string, $enc){ $det_enc = mb_detect_encoding($string, "UTF8, SJIS"); if ($det_enc and $det_enc != $enc){ return mb_convert_encoding($string, $enc, $det_enc); }else{ return $string; }}

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

  • ベストアンサー
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

恐らく「暴」でも駄目でしょうね。 いわゆるバクスラ問題(バックスラッシュ問題)というやつです。 表「955C」や暴「965C」ですが 文字コードの下位バイトが5Cです。この5Cはバクスラ「日本のコードでは¥(円マーク)」 ですがこれはエスケープ文字なのでこれが不具合を引き起こしているのでしょう。 最後が表「965C」で終わる場合、「965C5C」としてはどうでしょうか? 「方針発表」→「方針発表\」で試してください。

hamaddux
質問者

お礼

回答有難うございます。 なるほど。原因は分かりました。 しかし、「\」を入れてみても解決にはいたりませんでした。 引き続きいろいろ試しながらもがいてみます。

hamaddux
質問者

補足

どうもありがとうございました。 解決しました。(たぶん) これから再度検証を行っていきます。 要は、「\」が不要だったようです。 No1さんの反対のstripslashesでいけそうです。

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

「表」でエラーということはシフトジスのままDBにいINSERTしてるのでしょうか。 DBに文字列をINSERTするときには$str = pg_escape_string($str) として文字列をエスケープしてから入れると良いです。SQLインジェクションの防止にもなります。

hamaddux
質問者

お礼

回答有難うございます。 DBにはUTF8に変換してINSERT出来ております。ちなみに変換後、SJIS表示で調べてみると、「表」は「陦ィ\」になっているようです。 教えて頂いた関数をそのまま使ってみますと、入力したデータが空になって保存されてしまいました。 ある文字の時だけ処理するように限定する必要があるのですかね? 無知で申し訳ありません。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

addslashes を使ってみるとか

hamaddux
質問者

お礼

回答どうも有難うございます。 関数 addsl($string){ if (!get_magic_quotes_gpc()){ return addslashes($string); }else{ return $string; } } というのも加え、試してみましたが結果は同じでした。

関連するQ&A

専門家に質問してみよう