任何人都可以解释UTF-8的"同一件事"吗?

new*_*erl 1 unicode utf-8

引自这里:

安全性也可能受到几种字符编码特征的影响,包括UTF-8:"相同的东西"(就用户而言)可以用几个不同的字符序列来表示.例如,具有急性重音的e可以由预先组合的U + 00E9 E ACUTE字符或通过规范等效序列U + 0065 U + 0301(E + COMBINING ACUTE)表示.即使UTF-8为每个字符序列提供单字节序列,每当字符串匹配,索引时,"同一事物"的多个字符序列的存在可能会产生安全性后果.

这是我以前从未解决的UTF-8的隐藏功能吗?

Joa*_*uer 5

这个问题实际上并不特定于UTF-8.所有编码都可以代表所有(或至少大多数)Unicode代码点.

Unicode 的一般思想是提供所谓的预组合字符(例如U + 00E9 E ACUTE),而是通常喜欢提供基本字符(例如U + 0065 LATIN SMALL LETTER E)和组合字符(例如U + 0301组合急性加速).这具有不必将每种可能的组合作为其自身特征提供的优点.

注意:U + xxxx表示法用于表示unicode代码点.它是与编码无关的引用Unicode字符的方式.

然而,当首次设计Unicode时,一个重要的目标是对现有的,广泛使用的编码具有往返兼容性,因此包括一些预先组成的字符(实际上包括来自拉丁语和相关字母表的大多数变音字符).

所以是(和tl; dr):在正确工作的Unicode应用程序中,U + 00E9应该以相同的方式呈现,并且与U + 0065后跟U + 0301的处理方式相同.

有一个称为规范化的非平凡过程可以通过将给定字符串减少为四种常规形式之一来帮助处理这些差异.

例如,传递两个字符串(U+00E9U+0065 U+0301)将在U+00E9使用NFC时产生,并且U+0065 U+0301在使用NFD时将导致.