为什么我们不能直接存储Unicode?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我们不能直接存储Unicode?相关的知识,希望对你有一定的参考价值。
我读了一些关于Unicode和UTF-8的article。
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的二进制文件。我认为原因是:
- Unicode不是Self-synchronizing code,所以如果
10 represent A 110 represent B 10110 represent C
当我在磁盘中看到10110时,我们无法告诉它是A和B或只是C.
- Unicode使用更多空间而不是UTF-8或UTF-16。
我对吗?
我想知道为什么我们必须将U + 12CA编码为UTF-8或UTF-16,而不是直接在磁盘中保存12CA的二进制文件。
你如何直接将12CA写入磁盘?它是一个比字节更大的值,因此您需要至少写入两个字节。你写的是12后跟CA吗?你刚刚用UTF-16BE编码了它。这就是编码是......如何将抽象数字写为字节的定义。
其他阅读:
阅读有关Unicode,UTF-8和UTF-8 everywhere网站的信息。
有超过一百万的Unicode code-points(你提到了1,114,111 ......)。因此,您需要至少21位才能将所有这些位分开(因为221> 1114111)。
因此,如果用足够宽的整数类型表示每个字符,则可以直接存储Unicode字符。实际上,该类型将是一些32位整数(因为处理3字节即24位整数不方便)。这称为UCS-4,有些系统或软件已经以这种格式处理它们的Unicode字符串。
另请注意,显示Unicode字符串非常困难,因为人类语言种类繁多(并且因为Unicode具有combining characters)。有些需要从右到左显示(阿拉伯语,希伯来语,......),其他从左到右(英语,法语,西班牙语,德语,俄语......),有些从上到下(中文,...) 。显示Unicode字符串的库应该能够显示包含英语,中文和阿拉伯语单词的字符串....然后您会看到解码UTF-8是Unicode字符串显示的简单部分(并且存储UCS-4字符串将无济于事许多)。
但是,由于英语是IT技术中的主要语言(出于经济原因),因此将字符串保持为UTF8格式通常更便宜。如果您的系统处理的大多数字符串都是英语(或者使用拉丁字母表的其他一些欧洲语言),它会更便宜,并且它们需要更少的空间来保持UTF-8。
我想,当中国成为IT的主导力量时,事情可能会改变(或者可能不会)。
(我不知道今天中国超级计算机或智能手机上最常用的编码;我猜它仍然是UTF-8)
在实践中,使用库(可能是C中的libunistring或Glib)来处理UTF-8字符串和另一个(例如C中的pango和GTK)以显示它们。您将在各种编程语言中找到许多与Unicode相关的库。
出于良好和特定的原因,Unicode不指定任何特定编码。如果它对您的方案有意义,您可以指定自己的方案。
由于Unicode没有指定任何序列化,因此无法“直接”存储Unicode,就像您无法“直接”存储数学数字或流程图来实现您设计的程序一样。这个问题并没有真正定义明确。
有许多现有的序列化格式(编码),因此除非您的要求与现有编码提供的要求明显不同,否则最有可能使用现有的序列化格式(编码);即使这样,它真的值得花费吗?
比特流只是比特流。按照惯例,我们将它们分成8组,称之为“字节”,后半部分的问题实际上是“如果它不是一个字节,你怎么知道哪个位属于哪个符号?”有很多方法可以做到这一点,但常见的方法通常定义一个特定长度的序列(8,16和32通常是方便的,因为与现代计算机上的总线宽度兼容等)但是,如果你真的想要,你可以想出一些与众不同的东西。霍夫曼树是一种实现传递可变长度结构的方式的一种方式(并且在许多压缩算法中用于精确的方式)。
以上是关于为什么我们不能直接存储Unicode?的主要内容,如果未能解决你的问题,请参考以下文章