当前位置: 首页 > 知识库问答 >
问题:

特殊的ảỏ字符中断UTF-8编码

宫铭
2023-03-14

我网站上的一位用户在文本字段中输入了特殊字符:Ảỏ

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

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

字符分割也发生在那里,因此我得到了一个普通的字母a和o,带有一个奇怪的单独的xCC字符,它破坏了UTF-8字符串编码,json\u encode函数因此失败。

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

共有1个答案

长孙阳泽
2023-03-14

不是这些字符打破了编码,只是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字符属性。

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

 类似资料:
  • 相关网站:http://nubix.ca/blog/we-have-a-drone-and-were-prepared-to-shot/

  • 问题内容: 我遇到了这行遗留代码,我试图找出这些遗留代码: 据我了解,它是使用相同的charSet进行编码和解码。 这与以下内容有何不同? 在任何情况下,两条生产线的输出将不同? ps:只是要澄清一下,是的,我知道Joel Spolsky撰写的关于编码 的出色文章! 问题答案: 这可能是很复杂的方式 这缩短了String,而所使用的基础char []则更长。 但是,更具体地说,将检查每个字符是否都

  • 该项目使用JSP、Servlets、Jquery、Tomcat6。 JSPs中的Charset设置为UTF-8,所有Tomcat连接器都使用uriencoding=UTF-8,我还使用了一个字符编码过滤器,如下所述。另外,我在meta标记中设置了contentType,我的浏览器会正确地检测到它。 在使用Jquery的Ajax调用中,我使用encodeURIComponent()作为URL参数,然

  • 问题内容: 我正在使用BeautifulSoup从HTML提取一些文本,但是我只是想不出如何正确地将其打印到屏幕(或与此相关的文件)上。 这是我的包含文本的类的样子: 当尝试打印一个实例时,这是我在控制台上看到的: 无论我尝试什么,都无法获得想要的输出(上面的文本应该是希伯来语)。我的最终目标是序列化到文件(使用json或pickle)并能够将其读回。 我在Ubuntu 10.10上使用Pytho

  • 我正在为一位位于巴西的客户开发一个网站。他的网站的一部分显示了用户的反馈/评论。 以下是一个例子: 正确版本: “这是我的一分钟!” 当我向用户输出时,显示如下内容: 不正确的版本: “这是我的一分钟!” 我将这些评论保存到mySQL数据库(Hostgator),并将数据库排序规则设置为“utf8\U unicode\U ci”。 在超文本标记语言的顶部,我声明了以下内容: 我使用Laravel

  • 本文向大家介绍php 判断字符串编码是utf-8 或gb2312实例,包括了php 判断字符串编码是utf-8 或gb2312实例的使用技巧和注意事项,需要的朋友参考一下 php 判断字符串编码是utf-8 或gb2312 第一种方法: 第二种方法: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!