2016-08-30 41 views
1

我目前正在接受以英文,俄文和乌克兰文输入的网站。在PHP字符串中查找unicode失败

用户通常会提交带有商标符号(™),日文字母(の)和德文字母(Ö)等字符的表格。

这很好,但有时当他们这些人物从什么地方复制粘贴他们提交输入像(0xD8000xDC00)(0xFFFD)(0×17),¿(为0xBF) 1/2 (0xBD)和ï(0xEF)(顺便提一下,有一个乌克兰字母“ї”,值为0x457)。

稍后,当该输入被转换以UTF-8 XML它引发此错误 “输入是不妥当的UTF-8,指示编码字节:!0x17已0xEF为0xBF 0xBD,线13330,列27”

有没有一种方法来验证用户输入中的这些'断'字符?

我正在考虑将每个字符从输入字符串转换为HEX值,然后与包含所有非法HEX值的数组进行比较。但是在这种方法中,问题是我不知道所有可能的“破”字符的代码。我知道经常出现0xEF 0xBF 0xBD,但我不知道还有多少。

有什么建议吗?

+0

的[从字符串中删除非utf8字符(可能的复制http://stackoverflow.com/questions/1401317/remove-non -utf8字符-从串) – iainn

回答

1

如果包含该表单的网页被编码为UTF-8,则每个现代浏览器都应提交被编码为有效UTF-8的表单字段。 (尽管如此,你仍然应该在服务器上验证它。)我认为这里发生的事情是不同的。该字节序列

0x17 0xEF 0xBF 0xBD 

有效UTF-8:传输块,随后U + FFFD替换字符的U + 0017 END。但是你提到了XML处理,而U + 0017是invalid in XML 1.0。 XML 1.0只允许

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] 

(XML 1.1 lifts this restriction部分)。我建议将它们传递给XML处理功能之前更换未在XML与替换字符允许ASCII控制字符:

preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', "\xEF\xBF\xBD", $value); 

或者,还包括U + FFFE和U + FFFF:

preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x{FFFE}\x{FFFF}]/u', "\xEF\xBF\xBD", $value); 
-2

也许iso-8859-1的作品。

我不知道这是否答案,你可以尝试一下。