unicode字符串

时间:2017-06-17 17:36:09

标签: unicode utf-8

我试图了解什么是" 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位字符串< 004D D800>的操作是完全合理的。并且,每个包含格式错误的UTF-16代码单元序列,并将它们连接起来形成另一个Unicode字符串< 004D D800 DF02 004D>,其包含格式良好的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数组的任何子数组

为了具体化,这里有几个例子:

    根据定义1,
  • [0xFF]将是UTF-8 unicode string,但不是定义2和3,因为来自UTF-8编码的unicode标量值的代码单元序列中不会出现0xFF
  • 根据定义3,
  • [0xB0]将是UTF-8 unicode string,但不是根据定义2,因为它是多字节代码单元的前导字节。

我只是迷失了这个"标准"。你有明确的定义吗?

1 个答案:

答案 0 :(得分:0)

  

我的感觉是unicode字符串是一系列unicode标量值。

不,Unicode字符串是代码单元的序列。标准不包含"许多定义",但只包含一个:

  

D80 Unicode字符串:包含特定Unicode编码格式的代码单元的代码单元序列。

这并不要求字符串格式正确(请参阅以下定义)。标准中没有其他引用与此定义相矛盾。相反,它们只说明了标准定义的Unicode字符串可能格式不正确。

应用程序只能创建格式良好的字符串,当然:

  

如果Unicode字符串声称采用Unicode编码形式,则它不得包含任何格式错误的代码单元子序列。

但该标准还包含一些关于如何处理格式错误的输入序列的部分。