0

非常に奇妙なエラーが発生しています。

両方の文字列が UTF-8 (mb_check_encoding と mb_detect_encoding で確認) であることを確認しましたが、文字列で utf8_decode を使用しようとすると、文字化けが返されます。この場合、実際には utf8_decode を使用する必要はなく、文字列は正常になります。

問題は、文字列をプルする UTF-8 データベースを使用している顧客がいて、utf8_decode を使用して PHP 用の文字列を解読していることです。そうしないと、スペース文字は Ã に置き換えられます。彼らは文字列を生成するために同じコードを共有していますが、何らかの理由で、この他の顧客のためにそれを生成すると、文字列はすべて間違っています.

文字列が utf 8 であるという事実以外に、utf8_decode を使用する必要があることを確認する方法はありますか?

いくつかの例:

Using utf8_decode for customer 1:
?0,107�per�km
Without utf8_decode for customer 1:
€0,107 per km

Using utf8_decode for customer 2:
$7.00 per km
Without utf8_decode for customer 2:
$7.00 per km

みんなありがとう!

4

1 に答える 1

0

mb_detect_encodingこれが示すように、情報detect_orderがなければ特効薬ではありません。

$ php -r 'echo mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"));'
UTF-8

明らかに間違っています。厳密に設定すると、少し役立ちます。

$ php -r 'var_dump(mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"),mb_detect_order(),true));'
bool(false)

なぜそれは間違っているのですか?mb_detect_encoding()さて、私の構成で使用可能な文字セットを調べてみましょう。

$ php -r 'var_dump(mb_detect_order());'
array(2) {
  [0] =>
  string(5) "ASCII"
  [1] =>
  string(5) "UTF-8"
}

ASCIIまあ、 &を保存するとUTF-8、他の文字セットは検出されません。character_set_resultsただし、Jonにはポイントがあります。すべてをutf-8として保存し、適切なデータベース設定を使用するか、mysql(使用していると思います...)接続で正しいだけでも、それを取得するトリックを実行できます保存方法に関係なく、utf-8として。ただし、私が思いつかない何らかの理由でこれがオプションでない場合は、どの文字セットが可能であるかを具体的に決めるのはあなた次第ですmb_detect_order

$ php -r 'echo mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"),"ASCII,UTF-8,ISO-8859-1,JIS", true);'
ISO-8859-1

つまり、可能な文字セットのリストを提供する責任があります。そのような情報が既にある場合は、おそらく文字セットを知ることができます (接続設定、データベース/テーブル設定、またはクライアント構成によってさえ)。など) ではなく、それを検出しようとします。

于 2013-07-17T19:16:55.943 に答える