为什么我们不能直接存储Unicode?

Win*_*oon 1 unicode encoding utf-8

我读了一些文章有关Unicode和UTF-8。

Unicode 标准描述了字符如何由代码点表示。代码点是一个整数值,通常以 16 进制表示。在标准中,代码点使用符号 U+12CA 表示,表示值为 0x12ca(十进制 4,810)的字符。Unicode 标准包含许多列出字符及其相应代码点的表格:

严格来说,这些定义意味着说“这是字符 U+12CA”是没有意义的。U+12CA 是一个码位,代表某个特定的字符;在这种情况下,它代表字符“ETHIOPIC SYLLABLE WI”。在非正式环境中,有时会忘记代码点和字符之间的这种区别。

总结上一节:Unicode 字符串是一系列代码点,它们是从 0 到 0x10FFFF(十进制的 1,114,111)的数字。该序列需要表示为内存中的一组字节(即 0 到 255 之间的值)。将 Unicode 字符串转换为字节序列的规则称为编码。

我想知道为什么我们必须将 U+12CA 编码为 UTF-8 或 UTF-16,而不是将 12CA 的二进制文件直接保存在磁盘中。我认为原因是:

  1. Unicode 不是自同步代码,所以如果

    10 represent A
    110 represent B
    10110 represent C
    
    Run Code Online (Sandbox Code Playgroud)

当我在磁盘中看到 10110 时,我们无法分辨它是 A 和 B 还是只是 C。

  1. Unicode 使用更多的空间,而不是 UTF-8 或 UTF-16。

我对吗?

Bas*_*tch 5

阅读有关UnicodeUTF-8UTF-8 无处不在的网站。

有超过一百万个 Unicode代码点(您提到了 1,114,111...)。因此,您至少需要 21 位才能将它们全部分开(因为 2 21 > 1114111)。

所以你可以直接存储 Unicode 字符,如果你用足够宽的整数类型来表示它们中的每一个。实际上,该类型将是一些 32 位整数(因为处理 3 字节即 24 位整数不方便)。这称为UCS -4,一些系统或软件已经以这种格式处理了它们的 Unicode 字符串。

另请注意,由于人类语言的多样性(并且因为 Unicode 具有组合字符),因此显示Unicode 字符串非常困难。有些需要从右到左显示(阿拉伯语、希伯来语....),有些需要从左到右显示(英语、法语、西班牙语、德语、俄语...),还有一些从上到下(中文...) . 显示 Unicode 字符串的库应该能够显示包含英语、中文和阿拉伯语单词的字符串......然后你会看到解码 UTF-8 是 Unicode 字符串显示的简单部分(存储 UCS-4 字符串无济于事很多)。

但是,由于英语是 IT 技术中的主要语言(出于经济原因),将字符串保存为 UTF8 格式通常更便宜。如果您的系统处理的大部分字符串是英语(或使用拉丁字母表的其他欧洲语言),那么它会更便宜,并且将它们保存在 UTF-8 中所需的空间更少。

我想当中国成为 IT 领域的主导力量时,事情可能会改变(也可能不会)。

(我不知道今天在中国超级计算机或智能手机上最常用的编码;我猜它仍然是 UTF-8)

在实践中,使用一个库(可能是C 中的libunistringGlib)来处理 UTF-8 字符串和另一个(例如C 中的pangoGTK)来显示它们。您会在各种编程语言中找到许多与 Unicode 相关的库


Mar*_*nen 3

我想知道为什么我们必须将U+12CA编码为UTF-8或UTF-16,而不是直接将12CA的二进制文件保存在磁盘中。

如何将12CA直接写入磁盘?它的值比一个字节所能容纳的要大,因此您需要至少写入两个字节。你写12后面加CA吗?您刚刚将其编码为 UTF-16BE。这就是编码……如何将抽象数字写为字节的定义。

其他阅读:

每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!)

实用的统一码