此Google Closure UTF-8字符串有效吗?

时间:2018-08-25 02:47:49

标签: javascript typescript utf-8

在Google Closure中,UTF-8 to byte array tests是字符串

\u0000\u007F\u0080\u07FF\u0800\uFFFF

应该转换为数组的

[0x00, 0x7F, 0xC2, 0x80, 0xDF, 0xBF, 0xE0, 0xA0, 0x80, 0xEF, 0xBF, 0xBF]

我尝试了其他一些JavaScript和TypeScript UTF-8到字节数组的实现,他们声称UTF-8字符串无效。

该字符串似乎覆盖了从1字节到2字节再到3字节的值。

Google正确还是其他图书馆?

1 个答案:

答案 0 :(得分:0)

Google是正确的。

字符串'\u0000\u007F\u0080\u07FF\u0800\uFFFF'代表Unicode代码点U+0000 U+007F U+0080 U+07FF U+0800 U+FFFF

这些代码点的文字转换为UTF-8确实是字节00 7F C2 80 DF BF E0 A0 80 EF BF BF,就像Google所说的那样。

请注意,根据non-character codepointU+FFFFUnicode standard

  

“非字符”是Unicode标准中永久保留供内部使用的代码点

     

...

     

在Unicode 1.0中,在代码表中将代码点U + FFFE 和U + FFFF 注释为“非字符代码”,而不是将实际名称标记为“ NOT A CHARACTER”。在该标准的更高版本中,“非字符”一词是从那些早期的注释和标签演变而来的。

尤其是:

  

问:非字符是否打算互换?

     

A:否。它们仅供内部使用。例如,它们可能在内部用作字符串中特定类型的对象占位符。或者可以将它们用于排序规则裁剪中,作为权重的目标,权重介于不同脚本的“真实”字符的权重之间,从而简化对“字母索引”实现的支持。

     

问:非字符不可互换吗?

     

A:这个问题引起了一些争议,因为Unicode标准对于非字符的状态有些含糊。标准中“非字符”定义的正式措辞始终表明,“不应交换非字符”。 这使一些人认为该定义实际上意味着“不得互换”,因此,任何Unicode字符串中都存在非字符会立即使该字符串按照标准格式错误。但是,预期用途非字符数需要能够在有限的上下文中(至少在API之间,甚至通过数据文件和其他“交换”方式)交换它们,以便可以按预期进行处理。最初定义中的“应该”一词的选择是有意的,这表明人们不应该正好交换非字符,这是因为它们的解释严格地属于任何使用它们的实现,因此它们没有公开可互换的语义。但是核心规范的文本和字符名称列表中的其他翔实的措词却有所不同并且措辞更加强烈,导致了相互矛盾的解释。

     

鉴于这种含糊的意图,UTC在2013年发布了Corrigendum #9,从非字符的定义中删除了“并且永远不应该互换”这一短语,以明确表示禁止互换不属于其中非字符的正式定义。勘误表9已被纳入Unicode 7.0的核心规范中。

     

问:非字符在Unicode字符串和UTF中是否无效?

     

A:绝对不是。非字符不会导致任何UTF中的Unicode字符串格式错误。可以在上表中清楚地看到,其中每个非字符代码点在UTF-32,UTF-16,和UTF-8 中都有格式正确的表示形式 。在一个UTF表示和另一个UTF表示之间转换非字符代码点的实现必须正确保留这些值。它们被称为“非字符”并且不打算用于开放交换的事实并不意味着它们在某种程度上是非法的或无效的代码点,这些代码点使包含它们的字符串无效。