0

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

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

4

1 回答 1

0

谷歌是正确的。

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

正如谷歌所说,这些代码点到 UTF-8的字面翻译确实是 bytes 。00 7F C2 80 DF BF E0 A0 80 EF BF BF

请注意,根据Unicode 标准U+FFFF,这是一个非字符代码点

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

...

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

尤其是:

问:非字符是用来交换的吗?

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

问:是否禁止非字符互换?

A:这个问题引起了一些争议,因为Unicode标准对非字符的地位有些模糊。标准中“非字符”定义的正式措辞一直表明非字符“不应互换”。这导致一些人认为该定义实际上意味着“不得互换”,因此任何 Unicode 字符串中存在非字符会立即使该字符串按照标准格式不正确。但是,非字符的预期用途需要能够在有限的上下文中交换它们,至少跨 API 甚至通过数据文件和其他“交换”方式,以便可以按预期处理它们。在原始定义中选择“应该”这个词是经过深思熟虑的,并且表明人们不应该尝试交换非字符,因为它们的解释严格地在使用它们的任何实现内部,因此它们没有公开可互换的语义。但核心规范文本和角色名称列表中的其他信息性措辞不同且措辞更强烈,导致相互矛盾的解释。

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

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

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

于 2018-08-31T00:14:41.853 回答