【发布时间】:2017-06-17 17:36:08
【问题描述】:
我试图了解什么是“Unicode 字符串”,而我对unicode standard 的阅读越多,我对它的理解就越少。让我们从来自 unicode 标准的定义开始。
-
unicode scalar value是介于 0x0 和 0xD7FF 之间或包括在 0xE000 和 0x10FFFF 之间的任何整数(D76,p:119)
My feeling was that a unicode string is a sequence of unicode scalar values。我会将UTF-8 unicode string 定义为UTF-8 中编码的unicode 标量值序列。但我不确定情况是否如此。这是我们在标准中可以看到的众多定义之一。
- “Unicode 字符串:包含特定 Unicode 编码形式的代码单元的代码单元序列”(D80,p:120)
但对我来说,这个定义非常模糊。太了解它有多糟糕了,这里还有一些其他的“定义”或标准中的奇怪东西。
(p: 43) “Unicode 字符串数据类型只是代码单元的有序序列。因此,Unicode 8 位字符串是 8 位代码单元的有序序列。” 根据这个定义,任何 uint8 序列都是有效的 UTF-8。我会排除这个定义,因为它会接受任何作为 unicode 字符串的东西!!!
(p: 122) "Unicode 字符串在所有情况下都不需要包含格式良好的代码单元序列。这相当于说特定的 Unicode 字符串不需要采用 Unicode 编码形式。例如,它谈论采用两个 Unicode 16 位字符串 和 的操作是完全合理的,每个字符串都包含一个格式错误的 UTF-16 代码单元序列,并将它们连接起来形成另一个 Unicode 字符串 ,其中包含格式良好的 UTF-16 代码单元序列。前两个 Unicode 字符串不是 UTF-16,但结果 Unicode 字符串是。 我会排除这个定义,因为不可能为以 UTF-16 编码的 unicode 字符串定义一系列 unicode 标量值,因为这个定义将允许切割代理对!!!
首先,让我们为UTF-8 unicode string 寻找一个明确的定义。到目前为止,我可以提出 3 个定义,但真正的定义(如果有的话)可能会有所不同:
- (1) 任何 uint8 数组
- (2) 来自
UTF-8中编码的 unicode 标量值序列的任何 uint8 数组 - (3) 来自
UTF-8中编码的 unicode 标量值序列的 uint8 数组的任何子数组
具体来说,这里有几个例子:
- [ 0xFF ] 根据定义 1 将是
UTF-8 unicode string,但不是定义 2 和 3,因为在来自UTF-8编码的 unicode 标量值的代码单元序列中不能出现 0xFF。 - [ 0xB0 ] 根据定义 3 将是
UTF-8 unicode string,但不是根据定义 2,因为它是多字节代码单元的前导字节。
我只是迷失了这个“标准”。你有明确的定义吗?
【问题讨论】:
-
这里已经干到死了,使用搜索功能对其他类似问题有一些很好的答案。
-
@马特。我已经搜索过了,我没有找到。此外,如果有明确的定义,我希望引用标准。如果你有一个,如果你能分享它,我会很高兴。或者至少给出最后一个例子的答案:
[ 0xFF ]和[ 0xB0 ]是否有效UTF-8 unicode strings -
好吧,公平地说,您可能无法从其他答案的规范中得到严格的定义,而是一个很好的解释,例如stackoverflow.com/questions/2241348/…。但是我认为您发布的第一个定义就是答案,它与后两个并不矛盾,因为 Unicode 字符串(在这个抽象级别)并不能保证其组成部分的有效性。
-
@马特。我已经知道一些关于 unicode 的事情。我对什么是代码单元、标量值、代码点和字素有很好的感觉。我也知道规范化的问题,这使得 unicode 中的平等概念变得困难。我也知道 UTF-8 和 UTF-16 如何编码一个标量值。但我真的在寻找 UTF-8 unicode 字符串的正式定义(例如数学中给出的定义)。第一个定义与其他 2 个定义相矛盾,因为 [ 0xFF ] 根据其他 2 个定义无效,但根据第一个定义有效。