我的应用程序正在处理网上商店/互联市场(如 ebay)中人们订单的送货地址。 我已经考虑了 UTF-8 编码,这意味着它可以正确处理 kyrillic、中文等字符。但是,有时我会收到带有未知字符 � 的条目,例如在 ebay 上查看的送货地址中已经出现了。所以一路上没有任何问题 - 字符串就是这样传递的。
现在我正在对官方(德语)地址数据库执行地址检查,如下所示:
$query = "SELECT DISTINCT * FROM adrCheck WHERE zip='".$zip."' AND street='".$street." AND city='".$city."'";
如果至少有一个结果,我知道地址一定是正确的。
无论如何,当出现那些不正确的字符时,我收到一个 SQL 错误 MYSQLi Error (#1267): Illegal mix of collations (cp850_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
我可以使用react到。
但是我希望能够事先检查并仅将那些编码正确的参数包含在查询中。
我试过了
print_r(mb_detect_encoding("K�ln")); // gives me UTF-8
print_r(mb_check_encoding("K�ln", "UTF-8")); // gives me 1 / true
和 preg_match method这也告诉我它是有效的 UTF-8。
我忽略了什么?关于如何处理这种偶尔出现的困惑用户输入有什么建议吗?
最佳答案
你的问题发生是因为你正在接收一个 latin-1
编码的字符串(很可能是因为你提到了一些关于德语的东西),并尝试将它们用作 UTF-8
字符串。
这在大多数情况下都可以正常工作,因为 latin-1
构建在 ASCII
之上,并且 ASCII
的所有字符在 中都是相同的>UTF-8
(所以你的数据库不关心)。
但德语 Umlaute
在 latin-1
和 UTF-8
中的编码不同,如果您尝试解释 ä
在 latin-1
中作为 UTF-8
它回退到您在上面显示的 � 符号。
您的测试 print_r(mb_detect_encoding("K�ln"));
告诉您它是 UTF-8
,因为 �-符号本身是 UTF- 的一部分8.通过复制错误字符串,它可能是在复制 �-符号,而不是曾经位于其位置的无效字符
尝试使用 http://php.net/manual/de/function.mb-convert-encoding.php 将您的输入字符串转换为 UTF-8
关于php - 防止非法混合排序规则/检查 php 中的正确排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43450471/