我目前正在建立一个接受英语,俄语和乌克兰语输入的网站。
用户经常使用商标(™),日文字母(の)和德文字母(Ö)等字符提交表单。
没关系,但有时当他们从某个地方复制粘贴这些字符时,他们会提交输入,例如(0xD8000xDC00), (0xFFFD),(0x17) ,¿(0xBF),½(0xBD)和ï(0xEF)(顺便说一下乌克兰字母'ї',其值为0x457)
稍后,当以UTF-8 XML转换该输入时,它会抛出此错误 “输入不正确UTF-8,表示编码!字节:0x17 0xEF 0xBF 0xBD,第13330行,第27列”。
有没有办法验证用户输入中的这些“已损坏”字符?
我在考虑将每个字符从输入字符串转换为HEX值,然后与包含所有非法HEX值的数组进行比较。但在这种方法中,问题是我不知道“破碎”字符的所有可能代码。我知道0xEF 0xBF 0xBD经常出现,但我不知道还有多少。
有什么建议吗?
答案 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有效。
我不知道这是不是答案,你可以尝试一下。