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

关于Unicode和表示字符所需的位数的混淆,unicode,Unicode,我对Unicode中有1114112个字符感到困惑,但同时我们可以使用UTF-16(使用16位)访问所有字符。我的意思是,他们不需要32位来存储吗 我听说它与代理项对有关,但我不知道它们实际上是什么。unicode有不同的编码。UTF-8和UTF-16都使用一个或多个8位或16位blob来表示单个字符,具体取决于任何unicode代码点 另一方面,wchar\u t或16位整数只能表示一些unicode代码点 关于代理项对: http://www.unicode.org/faq/utf_bo

我对Unicode中有1114112个字符感到困惑,但同时我们可以使用UTF-16(使用16位)访问所有字符。我的意思是,他们不需要32位来存储吗


我听说它与代理项对有关,但我不知道它们实际上是什么。

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

另一方面,wchar\u t或16位整数只能表示一些unicode代码点

关于代理项对:


http://www.unicode.org/faq/utf_bom.html#utf16-4

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

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

同时,BMP中的2048个代码点被作为所谓的高和低替代项留出。其中两个代表另一个平面中的一个角色。这就启用了UTF-16,其中每个代码单元仍然有两个字节长,并且一个或两个代码单元(在后一种情况下,通过组合高代理和低代理)将表示单个代码点。同样,有人宣布,这些代理不得单独出现或顺序错误。代理字符主要是一个奇怪的特性(它们构成Unicode中最大的非字符块),但从技术上讲,代理字符是实现从16位到21位Unicode路径的最干净的方式

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

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

  • 先读。然后再问一次是否还有问题。文章不错。但我还是不明白用Unicode将字符存储为两部分的神话?上下?如果你能举个例子解释一下,那就很方便了。如果一个汉字(任何一个)要存储,它将如何存储?它可以以多种方式存储。以蒂姆为例,事实上,我发现乔尔的文章在某些方面相当欠缺。它可能会让一些基本概念变得清晰,但Unicode太复杂了,无法在这么短的文章中概括。请问另一个问题。用一种有用的方式去问它,这样你就能得到答案。老兄,你应该为维基百科写作!不,根据我的知识,我真的不能写出一篇连贯的文章。回答问题容易多了。此外,我只是Unicode邮件列表中的一个潜伏者,那里的许多人知道的比我多得多(如果以上信息是正确的话)。