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

Php UTF-8字符串的解码会损坏一个字符串,但不会损坏另一个字符串,php,string,utf-8,Php,String,Utf 8,我犯了一个很奇怪的错误 我已经验证了我的两个字符串都是UTF-8(通过mb_check_编码和mb_detect_编码进行检查),但是当我尝试对字符串使用utf8_解码时,它将向我返回垃圾字符。在这种情况下,我实际上不需要使用utf8_解码,字符串将是正常的 困难在于,我有一些客户使用UTF-8数据库,我从中提取字符串,并使用utf8_解码为PHP取消字符串的加密。否则,空格字符将替换为̃。它们共享相同的代码来生成字符串,但由于某种原因,当我为另一个客户生成字符串时,字符串出现了所有错误 除了字

我犯了一个很奇怪的错误

我已经验证了我的两个字符串都是UTF-8(通过mb_check_编码和mb_detect_编码进行检查),但是当我尝试对字符串使用utf8_解码时,它将向我返回垃圾字符。在这种情况下,我实际上不需要使用utf8_解码,字符串将是正常的

困难在于,我有一些客户使用UTF-8数据库,我从中提取字符串,并使用utf8_解码为PHP取消字符串的加密。否则,空格字符将替换为̃。它们共享相同的代码来生成字符串,但由于某种原因,当我为另一个客户生成字符串时,字符串出现了所有错误

除了字符串是utf 8这一事实之外,是否有其他方法可以验证我是否需要使用utf8\U解码

一些例子:

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

谢谢大家

mb\u detect\u编码
没有通知的
detect\u顺序
不是银弹,这将证明:

$ php -r 'echo mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"));'
UTF-8
显然是错误的,将其设置为strict有一点帮助:

$ php -r 'var_dump(mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"),mb_detect_order(),true));'
bool(false)
为什么是假的?好的,让我们检查一下我的配置中可能使用的字符集
mb\u detect\u 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中仅使用一个正确的
字符集\u results
(我假设您使用…)连接就可以将其检索为utf-8,而不管它是如何存储的。然而,如果出于我想不出的任何原因,这不是一个选项,那就由您具体说明
mb\u detect\u order
可以使用哪些字符集

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

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

如果数据库中的编码数据不一致,难怪您会看到类似的情况。感谢您的评论。客户是国际性的,所以必须使用不同的编码标准。为什么?我们正在谈论UTF-8,它可以容纳所有这些设备。不管怎样,如果他们的数据库因为任何原因被弄乱了。。。。我不确定问题是什么。