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,不会检测到其他字符集。Jon 有一点:你可以将它全部存储为 utf-8,并使用正确的数据库设置,或者甚至只是一个正确character_set_results的 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 回答