问题

Unicode 是不是只有两个字节,为什么能表示超过 65536 个字符?

回答
Unicode 确实是个非常有意思的编码系统,它设计初衷就是要“包容万象”,能够表示世界上几乎所有的文字符号,甚至表情符号和一些技术符号。很多人一开始可能会误以为 Unicode 只有两个字节,这是因为在它发展的早期,也就是 UTF16 编码出现的时候,很多常用的字符确实可以用两个字节(16位)来表示。

想象一下,一个字节是8个“开关”(bit),可以表示2的8次方,也就是256种不同的组合。两个字节的话,就是16个开关,能表示2的16次方,也就是65536种组合。在 Unicode 发展的初期,这看起来已经足够大了,足以容纳当时世界上绝大多数的常用文字。

但是,人类的文字和符号是极其丰富的,而且随着时间推移,人们还需要表达更多的内容。65536个组合很快就捉襟见肘了。特别是当人们开始考虑如何表示一些不常用但非常重要的字符,比如历史文字、古老的书写系统,甚至是像一些表情符号这样的新事物时,两个字节就显得力不从心了。

那么,Unicode 是如何突破这个“65536”的限制,并且还能表示超过这个数量的字符呢?这里就要说到 Unicode 的核心思想和编码方案的演进了。

首先,Unicode 本身是一个字符集,你可以把它想象成一个巨大的、不断扩充的“电话号码簿”,里面给每一个字符都分配了一个独一无二的编号,这个编号就叫做码点 (Code Point)。最开始的时候,这些码点确实很多都落在 0 到 65535 的范围内(也就是我们常说的基本多文种平面,BMP)。

但是,Unicode 为了能够表示更多的字符,引入了增补平面 (Supplementary Planes)。你可以理解为,在最初的“电话号码簿”之外,又开辟了更多的“分册”,来记录那些超出第一个“号码簿”范围的字符。这些增补平面的字符,它们的码点编号就超过了 65535。

现在的问题来了,我们之前说的“字节”是用来编码这些码点的。就像你可以用不同的方式来书写一个电话号码一样,Unicode 也有多种编码方式。最常见的有 UTF8、UTF16 和 UTF32。

UTF32:这种编码方式非常直接,它用固定的 32 个比特(也就是 4 个字节)来表示每一个 Unicode 码点。这样一来,无论码点有多大,它总能被表示,非常简单,但缺点是占用空间大。

UTF8:这是目前互联网上最广泛使用的编码方式。UTF8 非常聪明,它是一种变长编码。它根据码点的大小,使用不同数量的字节来表示。
对于那些在 0 到 127 范围内的码点(也就是 ASCII 字符,比如英文字母、数字),UTF8 只用 1 个字节来表示。这和 ASCII 编码完全兼容,非常高效。
对于在 128 到 2047 范围内的码点,UTF8 使用 2 个字节。
对于在 2048 到 65535 范围内的码点(也就是 BMP 里的很多字符,比如中文、日文、韩文等),UTF8 使用 3 个字节。
而对于那些位于增补平面、码点大于 65535 的字符,UTF8 就需要使用 4 个字节来表示了。

UTF16:这是你最初可能接触到的编码,它使用 16 个比特(2 个字节)作为基本单位。
对于 BMP 中的字符,UTF16 可以用 2 个字节(一个 16 位代码单元)直接表示。
但是,对于增补平面中的字符,由于它们的码点超过了 16 位所能表示的范围,UTF16 就需要使用一种叫做代理对 (Surrogate Pairs) 的机制。你可以理解为,它用两个 16 位的代码单元“组合”起来,来表示一个超出范围的码点。这两个代码单元本身是没有意义的,只有当它们成对出现时,才能解码出一个增补平面的字符。

所以,你说的“两个字节”可能主要指的是 UTF16 在表示 BMP 字符时的情况,或者是 UTF8 在表示 ASCII 字符时的情况。但 Unicode 的设计远不止于此。通过引入增补平面和使用 UTF8 这样的变长编码,Unicode 能够非常灵活且高效地表示远远超过 65536 个字符。它能表示的字符数量,理论上可以达到一百多万个,这足以应对目前以及可见的未来各种语言和符号的需求。

总结一下,Unicode 能够表示超过 65536 个字符,是因为它不仅仅是一个固定的 16 位编码,它是一个庞大的字符集,拥有远超 65536 个码点,并且提供了像 UTF8 这种能够动态分配字节数以容纳这些码点的编码方式。

网友意见

user avatar

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。

你只是大致知道平面0(「Basic Multilingual Plane」,即「BMP」)的 65536 个码点(即 0x0000 至 0xFFFF)如何编码,这不是 Unicode 的全部。

  • BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8 编码时使用1至3字节。
  • 超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。
  • 另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。

Unicode 的基础是一个编号的字符集,在字符集之上又规定了模块化的编码等等技术层次,各种具体的编码形式并不一致,你说的「Unicode 只有两个字节」这句话根本不成立。

这种基础问题应当直接去看维基百科:

Unicode

类似的话题

  • 回答
    Unicode 确实是个非常有意思的编码系统,它设计初衷就是要“包容万象”,能够表示世界上几乎所有的文字符号,甚至表情符号和一些技术符号。很多人一开始可能会误以为 Unicode 只有两个字节,这是因为在它发展的早期,也就是 UTF16 编码出现的时候,很多常用的字符确实可以用两个字节(16位)来表.............
  • 回答
    你这个问题问得很有意思,也触及到了中文信息处理的核心。为什么 Unicode 编码里的中文不是按照拼音首字母顺序排列的呢?这背后其实是历史、技术和文化等多方面因素共同作用的结果,而且理解这一点,也能帮助我们明白为什么中文在计算机世界里不像英文那样直接简单。核心原因:Unicode 的目标是“表示”而.............
  • 回答
    Unicode 字符集就像一个巨大的数字宝库,里面藏着数不胜数的文字、符号,甚至还有表情包,但其中有一些字符,它们的出现和用途,着实让人觉得“神奇”,仿佛拥有某种隐藏的魔力。它们不像我们日常可见的字母和数字那样直观,却在某些时刻扮演着至关重要的角色。1. 那块看不见的“空气”——零宽度不连字 (Ze.............
  • 回答
    好的,我们来好好聊聊 Unicode 和 UTF8 这俩大家伙,保证说得明白,也尽量别让我这电子脑袋的痕迹跑出来。想象一下,咱们写信的时候,得用一套大家都认识的语言和符号,对吧?比如中文,我们要写“你好”;英文呢,就是“Hello”。这就像我们用不同的文字系统来表达意思。Unicode:那个大大的“.............
  • 回答
    这是一个非常有趣且值得深入探讨的问题,它触及了文字演变、编码历史以及文化传承的多个层面。「凉」和「凉」这两个看似极其相似的字,在 Unicode 中之所以并存,其根源在于它们各自拥有独立的历史渊源和演变轨迹,并在不同的历史时期被记录、规范化,最终进入了现代的字符编码体系。一、追溯本源:汉字的演变与分.............
  • 回答
    这个问题很有意思,你可能觉得一个符号怎么就变成了我们熟悉的苹果标志呢?这其实涉及到几个层面,我来给你掰开了揉碎了说,保证听着顺畅,没有那些硬邦邦的AI腔。首先,我们要明白,电脑里的每一个字、每一个符号,最终都要转化为一串数字,这个数字操作系统和应用程序才能识别和显示。Unicode就是一套非常庞大、.............
  • 回答
    想要将我们钟爱的中国传统美食加入 Unicode 标准,这可不是一件简单的事,里面门道可不少。它不像我们平时在手机上选表情那么随意,而是需要经过一系列严谨的流程和充分的论证。下面我就给大家掰扯掰扯,到底怎么才能让包子、油条、春卷这些美味,以及烧卖、豆腐脑、火锅这样的特色菜肴,在世界的数字舞台上拥有自.............
  • 回答
    看到 Unicode 13 收录了“biáng”(U+30EDE)字,这确实是个挺有意思的事儿,尤其对于关注文字编码和文化传承的人来说。要说怎么看待它,我觉得可以从几个维度去理解,它不仅仅是一个字的收录,更像是一种对特定文化符号的认可和保护。首先,它代表着一种文化生命力的体现。“biáng”这个字,.............
  • 回答
    GB2312、其扩展标准与Unicode的区别、优劣势详解在计算机和文本处理领域,字符编码是至关重要的基础。它决定了计算机如何存储、识别和显示文字信息。GB2312、其扩展标准(如GBK)以及Unicode是三种不同时期和设计理念下的字符编码标准,它们之间存在显著的区别和各自的优劣势。 1. GB2.............
  • 回答
    GB 18030 和 Unicode 之间存在非常密切且复杂的关系,理解这种关系对于处理中文和东亚字符集至关重要。简单来说,GB 18030 是中国国家标准,它 包含并扩展了 Unicode 中的部分字符,并且在设计上 与 Unicode 保持了兼容性。下面我将尽量详细地解释它们之间的关系:1. G.............
  • 回答
    说到开发 Windows 程序,在字符串编码方面,2020 年时,绝大多数情况下,使用 UNICODE 是更实际、更推荐的选择。 这一点,即使在今天(2023 年)依然如此,甚至可以说更加明确。让我来详细分析一下原因,并尽量让你感觉这是一个人写的经验之谈,而不是机器生成的报告。首先,我们得明白这俩玩.............
  • 回答
    在 C 中,将 GBK 编码的字符串转换成 Unicode(通常在 .NET 中指代 `System.String` 类型,其内部使用 UTF16 编码)是一个非常常见的需求。这通常涉及到对原始字节数据的正确解读和重新编码。首先,我们需要明白 GBK 和 Unicode(UTF16)是两种不同的字符.............
  • 回答
    Windows 记事本提供的这几种编码模式,说白了,就是把我们写进文档里的文字“翻译”成电脑能理解的二进制数字,以及再“翻译”回来的一种方式。它们就像是不同版本的“密码本”,各自有一套规则。首先,我们得明白,电脑只能处理数字,它不认识“你好”这样的汉字,也不认识“Hello”这样的英文字母。所以,我.............
  • 回答
    微软之所以没有将 Windows 的默认字符集一股脑地设置为 Unicode,这背后其实牵扯到了一系列复杂的技术考量和历史遗留问题,并非简单的一刀切就能解决。首先,我们需要理解“默认字符集”这个概念在 Windows 系统早期以及至今的重要性。在 Windows 发展的早期,计算机处理的文本内容远没.............
  • 回答
    这个问题问得非常好,它涉及到计算机内部处理文本的底层原理和不同编码的优劣势。简单来说,计算机不是“不直接使用 UTF8 进行存储”,而是更准确地说,计算机在内部更倾向于使用一种统一的、能够表示所有字符的抽象表示,然后根据需要将其转换为不同的字节序列表示(编码),而 UTF8 就是最常用的一种字节序列.............
  • 回答
    在使用Eclipse进行开发时,你可能会遇到这样一个现象:直接将一个整数值(比如3)强制转换为 `char` 类型,Eclipse 会告诉你这样做不合法,或者即使编译通过,在运行时也可能出现意想不到的行为,尤其是在试图输出对应的字符时。而如果你通过其他方式,比如使用Unicode转义序列来表示,却能.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有