我有一个非常奇怪的错误。
我已经验证我的字符串都是UTF-8(通过mb_check_encoding和mb_detect_encoding检查)但是当我尝试在字符串上使用utf8_decode时,它会向我返回乱码。在这种情况下,我实际上不需要使用utf8_decode,字符串将是正常的。
困难在于我有客户使用我从中提取字符串的UTF-8数据库,并且我使用utf8_decode来解析PHP的字符串。如果我不这样做,空格字符将替换为Ã。它们共享相同的代码来生成字符串,但出于某种原因,当我为其他客户生成字符串时,字符串出错了。
有没有办法让我验证除了字符串是utf 8之外我还需要使用utf8_decode? p>
一些例子:
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
谢谢你们!
答案 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
简而言之:你负责提供可能的字符集列表,如果你已经拥有这类信息......你可能知道这个角色设置(通过连接设置,数据库/表设置,甚至只是客户端配置等)而不是尝试检测它。