关于Unicode的混淆以及表示字符所需的位数

时间:2012-03-08 11:36:37

标签: unicode

我很惊讶Unicode中有1,114,112个字符,但同时我们可以使用UTF-16(使用16位)来访问所有字符。我的意思是,他们不需要存储32位吗?

我听说它与代理对有关,但我不知道它们究竟是什么。

2 个答案:

答案 0 :(得分:2)

Unicode历史上是一个16位代码和字符集(在最初的版本中)。这也是当UCS-2被创建为编码时,通用字符集中的每个字符都是2字节单位。

很快就清楚了(也是由于项目的一些范围变化)16位,因此65536个字符太少无法使用,Unicode被扩展到21位,组织在17个 plane 其中第一个65536字符组成第0个基本多语言平面(BMP)。

同时,BMP中的2048个代码点被搁置为所谓的高和低代理。其中两个代表另一个平面中的角色。这启用了UTF-16,其中每个代码 unit 仍然是两个字节长,一个或两个代码单元(在后一种情况下通过组合高和低代理)将代表单个代码。同样,有人宣称这些代理人可能不会出现孤立或错误的顺序。代理字符主要是奇怪的(它们构成Unicode中最大的非字符块),但在技术上是从16位到21位Unicode的最简单方法。

无论您听到或想到什么,Unicode都不是历史上最长时间的16位代码,目前没有任何东西需要任何16位代码。但是:

  1. 早期采用Unicode的系统和环境最初使用的是UCS-2,因为这是一种支持新字符集中所有字符的简单方法。那些过渡到UTF-16。 Windows,Java和.NET(由于其Windows传统)就是这样的例子。
  2. 现在大多数其他地方都使用UTF-8,这也是网络上的主要编码(据谷歌称)。 UTF-8不需要代理对,而是采用不同的方案,其中代码点由一个(ASCII),两个,三个或四个代码单元表示(取决于代码点)。
  3. 还有UTF-32,与UCS-4相同,每个字符使用四个字节。这主要用于软件的一些内部过程,其中每个代码点需要具有相同的长度。它很少用于存储或交换。

答案 1 :(得分:0)

unicode有不同的编码。 UTF-8和UTF-16都使用一个或多个8或16位blob来表示单个字符,具体取决于任何unicode代码点。

另一方面,

wchar_t或16位整数只能代表一些unicode代码点。

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

关于代理人对:

http://msdn.microsoft.com/en-us/library/8k5611at.aspx http://www.unicode.org/faq/utf_bom.html#utf16-4