“Unicode 编码”语句是否准确?[关闭]

Is the statement "Unicode encoding" accurate? [closed]

提问人:korangar leo 提问时间:9/20/2023 最后编辑:jpskorangar leo 更新时间:9/20/2023 访问量:53

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章用事实和引文来回答。

上个月关闭。

许多教程都提到了术语“Unicode 编码”,但我觉得这不合适。

根据我的理解,Unicode只是一个字符集,而不是编码。所谓编码,应该是Unicode字符的一种存储方式,如UTF-8编码、GBK编码、GB2312编码等。它们将字符编码为字节序列,不同的编码规则可能导致不同的字节序列。所以我认为“Unicode 编码”的说法是不准确的。

Unicode 编码 术语

评论

0赞 user17732522 9/20/2023
没有单一的“Unicode 编码”,但也许您引用的教程非正式地使用它来表示任何可以表示所有 Unicode 标量值序列的编码(例如 UTF-8、UTF-16、UTF-32 等)?(尽管作者也可能根本不知道他们在说什么。不幸的是,这种情况经常发生。在教程中使用这个术语的示例是什么?
0赞 korangar leo 9/20/2023
@user17732522 例如,对于 python 的 encode 和 decode 方法,encode 用于将字符串转换为字节序列,decode 用于将字节序列转换为字符串。有教程提到,对于字节序列,它可能有很多编码形式,但对于字符串来说,只有一种编码,那就是Unicode编码。我觉得这里的Unicode编码不是很准确。
2赞 user17732522 9/20/2023
是的,在这种情况下,字符串类型表示 Unicode 码位序列。据我所知,这通常不被称为“编码”。正如 Python 函数和提示的那样,字符串是解码状态,字节字符串是编码状态。decodeencode
0赞 Mark Ransom 9/20/2023
@user17732522在 Python 2 中存在一些混淆,因为类型实际上指定了字节而不是代码点。但是 Python 3 解决了这个问题,没有人应该再关心 Python 2 了。str
0赞 user17732522 9/20/2023
@MarkRansom 是的,我在上面的交流中假设了 Python 3,否则从教程中解释的 OP 根本没有意义。

答:

1赞 Joe Sewell 9/20/2023 #1

你是对的。Unicode 是一组系统,包括一个码位列表,以及将一系列码位转换为一系列代码单元(例如 UTF-8 的字节、UTF-16 的 16 位值等)的多种编码。

然而,从历史上看,Unicode 最初是纯粹的 16 位编码。引自维基百科,引自 1988 年的原始提案:

Unicode 旨在满足对可行、可靠的世界文本编码的需求。Unicode 可以粗略地描述为“宽体 ASCII”,它已被拉伸到 16 位,以包含世界上所有现存语言的字符。在设计得当的设计中,每个字符 16 位足以实现此目的。

最初的意图是只对通用的现代用法中的字符进行编码,规范假设 16 位可以很好地满足这些要求。然而,这是一个短视的假设,Unicode 2.0 通过将“代理对”系统引入 16 位编码来扩展码位范围。这追溯性地将Unicode 1.0(当时称为“Unicode”)编码命名为“UCS-2”,而带有代理项的新16位编码被命名为“UTF-16”。

由于这些历史因素,一些系统和文档可能仍然说“Unicode”,而它们实际上是指“UTF-16”或“UCS-2”。Windows 是一个常见的例子,我很确定我已经看到很多地方说“Unicode”但产生 UTF-16 Little Endian。

评论

1赞 user17732522 9/20/2023
"由于这些历史因素,一些系统和文档可能仍然说“Unicode”,而它们实际上意味着“UTF-16”或“UCS-2”。相反,他们似乎读到了一些声称 Python 的(解码)字符串类型具有“Unicode 编码”的东西。
0赞 Mark Ransom 9/20/2023
我认为Microsoft是主要罪犯。当只有一种形式时,他们开始在文档中使用术语“Unicode”,并且从未更改过。
0赞 korangar leo 9/20/2023
我很好奇 Python 中默认存储的 unicode 字符是什么编码?它会与 ?sys.getdefaultencoding()
0赞 Mark Ransom 9/20/2023
@korangarleo不,它不会。Python 实际上在内部使用多种编码,并跟踪任何单个字符串使用的编码。这对您的程序是完全透明的。