在PHP字符串中查找unicode失败

时间:2016-08-30 14:10:04

标签: php unicode utf-8

我目前正在建立一个接受英语,俄语和乌克兰语输入的网站。

用户经常使用商标(™),日文字母(の)和德文字母(Ö)等字符提交表单。

没关系,但有时当他们从某个地方复制粘贴这些字符时,他们会提交输入,例如(0xD8000xDC00)(0xFFFD)(0x17) ,¿(0xBF),½(0xBD)和ï(0xEF)(顺便说一下乌克兰字母'ї',其值为0x457)

稍后,当以UTF-8 XML转换该输入时,它会抛出此错误 “输入不正确UTF-8,表示编码!字节:0x17 0xEF 0xBF 0xBD,第13330行,第27列”

有没有办法验证用户输入中的这些“已损坏”字符?

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

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

0x17 0xEF 0xBF 0xBD

有效的UTF-8:U + 0017 END OF TRANSMISSION BLOCK后跟U + FFFD REPLACEMENT CHARACTER。但是你提到了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处理函数之前,用替换字符替换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);

答案 1 :(得分:-2)

也许iso-8859-1有效。

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