2017-04-17 47 views
1

我的应用程序正在处理网上商店/连接的市场,如易趣的人的订单交付地址。 我已经说明了正确处理kyrillic,chinese等字符的UTF-8编码。但是,我有时会收到一些未知字符entries,这些字符已经出现在ebay查看的收货地址中。所以沿途没有任何问题 - 弦乐就是这样传递的。防止非法混合排序/检查正确的排序在php

现在,在某些时候,我反对的正式执行地址校验(德国)地址DB像这样:

$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 '=',我可以作出反应。 但我希望能够事先检查,并只包含这些参数到正确编码的查询中。

我已经试过

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。

我在忽略什么?有关如何处理这种偶然的snafu用户输入的任何建议?

+0

什么字符集不为表的数据库使用和你设置HTML中的元字符集研究“黑钻石”?如果您使用准备好的语句而不是简单的'。$ var.' – Gntem

+0

该数据库配置为utf8_general_ci。我还在我的中使用了'。此外,我设置了header('Content-Type:text/html; charset = utf-8');'在我的index.php的开头。最后但并非最不重要的是,在初始化我的连接之后,我正在查询'SET NAMES'utf8''。可能是矫枉过正?! – Engle

+0

你对准备好的陈述是正确的。虽然我采用了这种更简单的方法,因为之前的输入已经通过几个数据库进行验证(eBay,亚马逊,商店软件......),并且在这种情况下我不写入数据库。 – Engle

回答

0

您的问题发生是因为您收到latin-1编码字符串(很可能是因为您提到了有关德语的问题),并尝试将这些字符串用作UTF-8字符串。 大多数时候这个工作正常,因为latin-1建立在ASCII之上,并且ASCII的所有字符在UTF-8(因此你db不关心)中是相同的。

但德国Umlautelatin-1UTF-8不同的编码,如果你尝试在latin-1UTF-8它退到您在上面显示的符号来解释一个ä

您的测试print_r(mb_detect_encoding("K�ln"));告诉您它是UTF-8,因为 -符号本身是UTF-8的一部分。通过复制错误字符串它可能复制-symbol而不是用于在其位

试图将输入字符串转换为UTF-8http://php.net/manual/de/function.mb-convert-encoding.php

+0

你的想法似乎很接近,但在99%的Umlaut案例中,事情是正确的。在我面前的特定订单现在例如有invoiceAdr“Köln”(正确)和deliveryAdr“K ln”(不正确)。 – Engle

+0

你从哪里得到这些数据?它是从其他来源导入的,还是来自您的数据库? –

+0

是的,来自送货地址最初来自易趣/亚马逊/网上订单。我注意到的情况如上所示,当你在那里查看订单细节时,例如在eBay上显示这个不兼容的字符“ALREADY”。我不知道人们有时会进入什么。 – Engle

0

似乎在我的情况下,无效的卡拉科特字符正在被导入到我的数据库中 - 这意味着像@Florian Moser提到的有效的UTF-8字符。我会继续简单地检查这个角色,看看它将来会留给我什么。

0

SELECT HEX(col) - 你会得到什么? (空间增加了清晰度。)

4B EFBFBD 6C 6E -- The input had the black diamond 
4B F6  6C 6E -- you stored latin1, not utf8 
4B C3B6 6C 6E -- correctly stored utf8 (or utf8mb4) 

你刚才提到中国 - 你真的需要使用utf8mb4,不只是utf8。 (Köln在两者中都是一样的。)

由于有多种情况,我建议你在Trouble with utf8 characters; what I see is not what I stored

+0

是的,结果是'4BEFBFBD6C6E',所以这证实了替换字符已经是传入数据的一部分。没有什么我可以从我的最终检查它并作出相应的反应。 关于中文..到目前为止我没有遇到任何问题(我正在研究一些已经运行了一些年的新版本),但我会研究它。感谢您的提示。 – Engle

+0

只有中国的一些字符需要4个字节的UTF-8编码(utf8mb4),所以中国你迄今所看到的可能不是一个问题。 –