Javascript 这个Google闭包UTF-8字符串有效吗?

Javascript 这个Google闭包UTF-8字符串有效吗?,javascript,typescript,utf-8,noncharacter,Javascript,Typescript,Utf 8,Noncharacter,在Google闭包中是字符串 \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字节的值 谷歌正确还是其他图书馆正确?谷歌正确。 字符串'\u0000\

在Google闭包中是字符串

\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字节的值

谷歌正确还是其他图书馆正确?

谷歌正确。 字符串
'\u0000\u007F\u0080\u07FF\u0800\uFFFF'
表示Unicode码点
U+0000 U+007F U+0080 U+07FF U+0800 U+FFFF

正如谷歌所说,这些代码点到UTF-8的直译实际上是字节
007fc280dfbf e0a08efbf

请注意,
U+FFFF
是a,根据:

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

在Unicode 1.0中,代码点U+FFFE和U+FFFF在代码图表中被注释为“非字符代码”,而不是实际名称被标记为“非字符”。在标准的后续版本中,术语“非字符”是从早期的注释和标签演变而来的

特别是:

问:非字符是否用于交换

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

Q:交换中是否禁止使用非字符?

答:这个问题引起了一些争议,因为Unicode标准对非字符的状态有些模糊。标准中“非字符”定义的正式措辞始终表明非字符“不应互换”。这导致一些人认为该定义实际上是指“不应互换”因此,根据标准,任何Unicode字符串中出现非字符都会立即导致该字符串的格式错误。但非字符的预期用途要求能够在有限的上下文中交换它们,至少在API之间,甚至通过数据文件和其他“交换”方式,以便能够按预期进行处理。在原始定义中选择“应该”一词是经过深思熟虑的,并表示不应该尝试精确地交换非字符,因为它们的解释严格地在使用它们的任何实现内部,因此它们没有公开的可互换语义。但是,核心规范文本和字符名称列表中的其他信息性措辞有所不同,措辞更加强硬,导致了相互矛盾的解释

鉴于这一意图的模糊性,UTC于2013年发布了一份文件,删除了非字符定义中的“且不应互换”一词,以明确禁止互换不是非字符正式定义的一部分。勘误表9已纳入Unicode 7.0的核心规范

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

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


“UTF-8到字节”没有意义——UTF-8是字节。您可以使用UTF-8编码将Unicode码点转换为字节。尝试
Array.from(new TextEncoder().encode('\u0000\u007F\u0080\u07FF\u0800\uFFFF'),x=>x.toString(16).padStart(2,'0'))
(如果这不能回答问题,请添加使用产生错误的其他库尝试的代码。)库1:库2这两个库似乎都从某个地方复制了相同的错误实现,假设在组成代理项对的代码点之后没有表示代码点的UTF-16代码单元。这种假设是不正确的;例如,请参见,其中明确提到了范围U+E000到U+FFFF。(里面有一些重要的东西!比如影响表情符号的变体选择器。)