繁体   English   中英

特殊 ä ö 字符会破坏 UTF-8 编码

[英]Special ä ö characters break UTF-8 encoding

我网站上的用户在文本字段中输入了特殊字符:ä ö

这些显然不是我可以从键盘输入的 ä ö 字符,因为当我将它们粘贴到程序员的记事本中时,它们分成两部分:a¨ o¨

在我网站的服务器端,我有一个 PHP 脚本,它可以识别用户输入中的非法特殊字符,并在带有preg_replace的 html 错误消息中突出显示它们。

字符拆分也在那里发生,所以我得到一个普通的字母 a 和 o,带有一个奇怪的单独 xCC 字符,它破坏了 UTF-8 字符串编码,结果json_encode函数失败。

处理这些角色的最佳方法是什么? 我应该尝试替换特殊的 ä ö 字符并用常规字符替换它们,还是可以以某种方式捕获损坏的 UTF-8 字符并删除或替换它们?

不是这些字符破坏了编码,只是Unicode真的很复杂

常用的重音字母在 Unicode 标准中有自己的代码点,在这种情况下:

  • U+00E4“带分音符的拉丁文小写字母 A”
  • U+00F6“带分音符的拉丁文小写字母 O”

但是,为了避免对所有可能性进行编码,特别是当需要在同一个字母上放置多个变音符号(重音符号)时,Unicode 包括“组合变音符号”,例如:

  • U+0308 "组合分色"

当放置在普通字母的代码点之后时,这些代码点在显示时会为其添加变音符号

正如您所见,这意味着有两种不同的方式来表示同一个字母。 为了帮助解决这个问题,Unicode 包括在 Unicode 标准的附件中定义的“规范化形式”:

  • 规范化形式 D (NFD):规范分解
  • 规范化形式 C (NFC):规范分解,然后是规范组合
  • 归一化形式 KD (NFKD):兼容性分解
  • 归一化形式 KC (NFKC):兼容性分解,然后是规范组合

暂时忽略“兼容性”表单,我们有两个选择:

  • 分解,尽可能多地使用组合变音符号
  • 组合,尽可能多地使用特定的代码点

因此,一种可能性是将您的输入转换为 NFC,这在 PHP 中可以通过intl扩展中的Normalizer来实现。

但是,并非所有组合都可以标准化为没有单独变音符号的形式,因此这并不能解决您的所有问题。 您还需要查看您想要允许的确切字符,可能是通过匹配 Unicode 字符属性

您可能还想了解“字素簇”并使用相关的 PHP 函数 “字素簇”,或只是“字素”,是大多数读者会认为的“一个字符”——例如一个带有所有变音符号的字母,或一个完整的表意文字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM