[英]Special ä ö characters break UTF-8 encoding
我网站上的用户在文本字段中输入了特殊字符:ä ö
这些显然不是我可以从键盘输入的 ä ö 字符,因为当我将它们粘贴到程序员的记事本中时,它们分成两部分:a¨ o¨
在我网站的服务器端,我有一个 PHP 脚本,它可以识别用户输入中的非法特殊字符,并在带有preg_replace
的 html 错误消息中突出显示它们。
字符拆分也在那里发生,所以我得到一个普通的字母 a 和 o,带有一个奇怪的单独 xCC 字符,它破坏了 UTF-8 字符串编码,结果json_encode
函数失败。
处理这些角色的最佳方法是什么? 我应该尝试替换特殊的 ä ö 字符并用常规字符替换它们,还是可以以某种方式捕获损坏的 UTF-8 字符并删除或替换它们?
不是这些字符破坏了编码,只是Unicode真的很复杂。
常用的重音字母在 Unicode 标准中有自己的代码点,在这种情况下:
但是,为了避免对所有可能性进行编码,特别是当需要在同一个字母上放置多个变音符号(重音符号)时,Unicode 包括“组合变音符号”,例如:
当放置在普通字母的代码点之后时,这些代码点在显示时会为其添加变音符号。
正如您所见,这意味着有两种不同的方式来表示同一个字母。 为了帮助解决这个问题,Unicode 包括在 Unicode 标准的附件中定义的“规范化形式”:
暂时忽略“兼容性”表单,我们有两个选择:
因此,一种可能性是将您的输入转换为 NFC,这在 PHP 中可以通过intl
扩展中的Normalizer
类来实现。
但是,并非所有组合都可以标准化为没有单独变音符号的形式,因此这并不能解决您的所有问题。 您还需要查看您想要允许的确切字符,可能是通过匹配 Unicode 字符属性。
您可能还想了解“字素簇”并使用相关的 PHP 函数。 “字素簇”,或只是“字素”,是大多数读者会认为的“一个字符”——例如一个带有所有变音符号的字母,或一个完整的表意文字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.