• ベストアンサー

mb_convert_encoding で?になる。

$old = "名前"; $new = 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が実験的だからなのでしょうか? 他にも同じようになる物があるのでしょうか? 対処方法はあるのでしょうか?

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

  • ベストアンサー
  • randman
  • ベストアンサー率51% (17/33)
回答No.2

以下の点を確認。 ・<?php~?>をHTMLで囲み、METAタグで文字コードを明示的に指定。 ・下記コードをプログラムの頭に設置。 mb_language("Japanese");//必須ではないけど一応 mb_internal_encoding("EUC-JP");//mb_convert_kana使用時に必須 mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS");//mb_detect_encoding使用時に必須 ・文字列の文字コード変更時に、変更前の文字列の文字コードを逐一取得する。 $buffer=mb_convert_encoding($buffer,"EUC-JP",mb_detect_encoding($buffer)); たぶん、mb_detect_orderの有無。でなければ、あきらめてUTF-8Nにする。

noname#10559
質問者

お礼

mb_detect_encoding($old)で文字コードを調べると、 UTF-8でした。という事は、 mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS"); だと、EUCより優先順位のたかい、UTF-8になってしまい、 EUCを一番最初にすると、きちんと表示されました。 で、ここで問題の原点に気がつきました。 metaタグで、charset=EUC-JP を記入しているので、 FORMから送られてくる情報は、EUCなのです。 マルチバイト関連が実験的なら、あまり考えずにその ままでもいいのかなー、と思いました。

その他の回答 (2)

回答No.3

こんにちは。 おそらく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 ご健闘を祈ります。

noname#10559
質問者

お礼

PHPは4.3.10なのでさらに下げるのは、ちょっと。^^; default_charset = EUC-JPにしたんですが、最終的に使っているサーバに、no valueにあわせたのでした。 あくまで、私の環境はテスト・開発用だしとりあえず配布は考えていないので。 htaccessを変える手もあるかと思いますが、さらに勉強が・・・。 とりあえず、mb_convert_encodingで優先度を変える方法で解決しました。 が、日本語の文字のコードの認識がどうも怪しいので、英数字のコードで認識・変換させようかと。 あとは、労力と時間と誤認確率の問題で、今の所は保留してます。^^; ありがとうございます。

回答No.1

w2kと言う事なので、当方Linuxとは違うかもしれませんが。。。 $new = mb_convert_encoding($old,"EUC-JP","auto"); の場合、"auto"では駄目な時が私の環境でもあります。 分る限り、"auto"ではなく、"SJIS"とか、"UTF-8"とか指定した方が良いです。 現在の内部エンコーディングの検出は echo mb_internal_encoding(); で出来ますし、設定も mb_internal_encoding("UTF-8"); あたりで出来ます。当然エディタの保存エンコーディングとの整合性が必要かと思います。 # 引っかかるとうまくいかないんですよねぇ~。

noname#10559
質問者

お礼

mb_internal_encoding()はEUCでした。 少し私も調べて見ました、autoでは、解決できない事も あるみたいですね。 meta タグで charset=EUC-JP" にしているのですが、 万が一のためにコードを統一しようとしたのが、過剰反応 だったみたいです。

関連するQ&A