質問: mb_convert_encoding($old,"euc-jp","auto"); echo "$new"; 上のスクリプトを実行すると、’名前’が半角の’?’に なるんですよー。 何ででしょうか? ページもeuc-jpだし、phpもeucです。 php version 4.3.10で、php.iniの mbstring.internal_encodingはeuc-jpです。 osは、テストなので自分のpcのw2kです。 mb_convert_encodingが実験的だからなのでしょうか? 他にも同じようになる物があるのでしょうか? 対処方法はあるのでしょうか?
回答: こんにちは。 おそらくphp.iniの設定でしょう。 最新のphpや、もしくは古いphpをインストールするとphp.iniの設定を修正しなくてはならないので注意が必要です。 php.iniの中身の一部を削除・書き換えたりして、試してみてください。おそらく、[mbstring] 内が怪しいでしょう。ここで設定されている値を色々書き換えて試してみてください。(注:php.iniがなくてもちゃんと動作しますので、[mbstring]の部分そっくり削除しても平気です) また、phpは文字コードの問題が非常に多いようなので、mbstring関連の関数はあんまり当てにしない方がいいかもしれません。特に、新しいバージョンのphpは問題が多いような気がします。 ただ、送られてきたデータがどんな文字コードを使っているかが、確実にわかればmb_convert_encoding関数でうまく変換出来る確率が上がるようです。 確実に、送られてきた文字コードを判別したいなら自分で文字コードを判別する関数を作ってしまったほうが納得がいくでしょう。そんな難しくないです。わかりやすそうなのを厳選してみました。以下のサイトをご覧になれば文字コード判別関数程度ならすぐ作れると思います。 perl言語で文字コード変換 :http://ash.jp/ash/src/codetbl/convcode_pl.txt c言語版 :http://www.alib.jp/c/kanji 文字コード表 :http://ash.or.jp/code/codetbl2.htm 初心者でもわかりやすい :http://www.mars.dti.ne.jp/~torao/program/appendix/japanese.html どんなデータが送られてくるかを予想するのは、経験を積むしかないでしょう。 perlやphpだけで、サーバ構築やc言語の経験がないとなかなか難しいものがあると思います。 送られてくるデータはeucと限定するのは、やめましょう。(これについてはクロスサイト スクリプティングという単語を検索してみてください。) 長くなりましたが、ご質問の問題を解決す方法として、以下を順番に試していってみてください ・php.iniを色々いじってみる ・mb_convert_encoding($old,"euc-jp","utf-8,euc-jp,jis,sjis")の、"utf-8,euc-jp,jis,sjis"の順番を変えてみる ・古いバージョンのphpを入れてみる ・osを変える ・文字コードチェック及び、文字コード変換関数を自分で作る ※参考に:php.iniのmbstringディレクティブの各項目を以下のように修正してみてください。 default_charset = euc-jp mbstring.language = japanese mbstring.encoding_translation = on mbstring.http_input = auto mbstring.http_output = euc-jp mbstring.internal_encoding = euc-jp mbstring.script_encoding = euc-jp mbstring.substitute_character = none ご健闘を祈ります。