【问题标题】:Find unicode fails in PHP string在 PHP 字符串中查找 unicode 失败
【发布时间】:2016-08-30 14:10:04
【问题描述】:

我目前正在开发一个接受英语、俄语和乌克兰语输入的网站。

用户经常提交带有商标符号 (™)、日文字母 (の) 和德文字母 (Ö) 等字符的表单。

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

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

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

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

有什么建议吗?

【问题讨论】:

标签: php unicode utf-8


【解决方案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 中不允许的 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);

【讨论】:

    【解决方案2】:

    也许 iso-8859-1 有效。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2017-09-26
      • 2013-09-26
      • 1970-01-01
      • 2011-04-08
      • 2012-06-04
      • 2018-04-25
      相关资源
      最近更新 更多