任何人都可以解释 UTF-8 "same thing"问题吗?



此处引用:

安全性也可能受到几个特征的影响编码,包括UTF-8:"相同的东西"(就用户而言tell(可以由几个不同的字符序列来表示。对于例如,带有锐音符的e可以由预编译的U+00E9 E ACUTE字符或通过标准等效序列U+0065 U+0301(E+合并急性(。尽管UTF-8提供了单字节序列对于每个字符序列"同一件事"的多个字符序列可能具有安全性字符串匹配、索引、时的后果

这是我以前从未处理过的UTF-8隐藏功能吗?

这个问题实际上根本不是UTF-8特有的。它发生在所有可以表示所有(或至少大多数(Unicode代码点的编码中。

Unicode的一般思想是提供所谓的预合成字符(例如,U+00E9 e ACUTE(,而他们通常喜欢提供基本字符(例如U+0065拉丁小写字母e(和组合字符(例如:U+0301组合ACUTE ACCENT(。这具有的优点是不必提供每种可能的组合作为其自身的特征。

注意:U+xxxx表示法用于表示unicode代码点。它是指代Unicode字符的独立于编码的方式。

然而当Unicode最初设计时,一个重要的目标是与现有的、广泛使用的编码具有往返兼容性,因此包括了一些预编字符(事实上,拉丁字母和相关字母表中的大多数变音符号字符都包括在内(。

因此是的(以及太长了,读不下去了(:在一个正常工作的可执行Unicode-的应用程序中,U+00E9应以与U+0065相同的方式呈现应以与U+0301相同的方式处理。

有一个称为规范化的非平凡过程,它通过将给定字符串简化为四种规范形式之一来帮助处理这些差异。

例如,当使用NFC时,传递两个字符串(U+00E9U+0065 U+0301(将导致U+00E9,而当使用NFD时将导致U+0065 U+0301

非常简短且可视化的示例:字符"é"可以使用Unicode代码点U+00E9(拉丁小写字母E WITH ACUTE,é(表示,也可以使用序列U+0065(拉丁大写字母E,e(后跟U+0301(组合ACUTE ACCENT,´(表示,它们看起来像这样:é

在UTF-8中,é具有xC3 xA9的字节序列,而é具有x65 xCC x81的字节序列。

注意:由于技术限制,此帖子不包含实际的组合字符

事实上,我不明白是什么意思

"即使UTF-8为每个字符提供一个单字节序列序列[…]">

这句话想说的是:

"任何给定的Unicode代码点序列都会通过UTF-8编码映射到一个(确切地说是一个(字节序列。"也就是说,UTF-8是(抽象的(Unicode代码点和字节序列之间的双射。

文本想要说明的问题是,"文本的字母"(如通常所理解的(和Unicode代码点之间没有双射,因为相同的文本可以用不同的Unicode代码点序列表示(如示例中所解释的(。

实际上,这与UTF-8无关;这是Unicode的一个基本特性:许多文本都有一个以上的表示作为Unicode代码点。在比较以Unicode表示的文本(无论采用何种编码(时,请务必记住这一点。

对此的一个(部分(解决方案是规范化。它为Unicode文本定义了各种范式,它们是文本的唯一表示。

最新更新