在PHP字符串中查找unicode失败

在PHP字符串中查找unicode失败,php,unicode,utf-8,Php,Unicode,Utf 8,我目前正在一个网站上工作,该网站接受英语、俄语和乌克兰语的输入 用户通常提交带有商标符号等字符的表单™, 日文信件の 和德语字母Ö 这很好,但有时当他们从某个地方复制粘贴这些字符时,他们会提交输入,比如可能iso-8859-1起作用 我不知道这是否是答案,你可以试试看。如果包含表单的网页编码为UTF-8,那么每个现代浏览器都应该提交编码为有效UTF-8的表单字段。不过,您仍然应该在服务器上验证这一点。我认为这里发生的事情是不同的。字节序列 0x17 0xEF 0xBF 0xBD 是有效的UTF

我目前正在一个网站上工作,该网站接受英语、俄语和乌克兰语的输入

用户通常提交带有商标符号等字符的表单™, 日文信件の 和德语字母Ö


这很好,但有时当他们从某个地方复制粘贴这些字符时,他们会提交输入,比如可能iso-8859-1起作用


我不知道这是否是答案,你可以试试看。

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

0x17 0xEF 0xBF 0xBD
是有效的UTF-8:U+0017传输块末尾,后跟U+FFFD替换字符。但您提到了XML处理,U+0017是。XML 1.0仅允许

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
XML1.1部分。我建议将XML中不允许的ASCII控制字符替换为替换字符,然后再将其传递给XML处理函数:

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);
可能重复的