UTF-8字符串的解码会破坏一个字符串,但不会损坏另一个字符串

时间:2013-07-17 17:52:23

标签: php string utf-8

我有一个非常奇怪的错误。

我已经验证我的字符串都是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

谢谢你们!

1 个答案:

答案 0 :(得分: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,并使用正确的数据库设置,或者甚至只在mysql(我假设你使用......)中只有一个正确的character_set_results连接就可以了检索它作为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

简而言之:负责提供可能的字符集列表,如果你已经拥有这类信息......你可能知道这个角色设置(通过连接设置,数据库/表设置,甚至只是客户端配置等)而不是尝试检测它。