对Unicode和多字节文章的困惑

时间:2010-03-05 02:22:15

标签: visual-c++ unicode internationalization

引用Joel's Article

  有些人是在   错误地认为Unicode只是一个   每个字符占用的16位代码   16位,因此有65,536   可能的人物。这不是,   实际上,正确。

在阅读完整篇文章之后,我的观点是,如果有人告诉你,他的文字是unicode,你将不知道他的每个角色占用了多少内存空间。他必须告诉你,“我的unicode文本是用UTF-8编码的”,然后只有你知道他的每个角色占用了多少内存空间。

Unicode =每个字符不需要2个字节


然而,当来到Code Project's ArticleMicrosoft's Help时,这让我很困惑:

微软:

  

Unicode是一个16位字符   编码,提供足够的编码   适用于所有语言。所有ASCII   字符包含在Unicode中   “加宽”的角色。


代码项目:

  

Unicode字符集是“广泛的   字符“(每个字符2个字节)设置   包含每个角色   提供各种语言,包括   所有技术符号和特殊   出版人物。多字节   字符集(MBCS)使用1或   每个字符2个字节

Unicode =每个字符2个字节?

65536个可能的角色是否能够代表这个世界上的所有语言?

为什么这个概念在Web开发人员社区和桌面开发人员社区中看起来有所不同?

3 个答案:

答案 0 :(得分:11)

曾几何时,

  • Unicode只有16位匹配的字符数和
  • UTF-8不存在或不是要使用的事实编码。

这些因素导致UTF-16(或更确切地说,现在称为UCS-2)被认为是“Unicode”的同义词,因为它毕竟是支持所有Unicode的 编码

实际上,您会看到在使用“UTF-16”或“UCS-2”时使用的“Unicode”。这是一个历史性的混乱,应该被忽略而不是传播。 Unicode是一组字符; UTF-8,UTF-16和UCS-2是不同的编码

(UTF-16和UCS-2之间的区别在于UCS-2是一个真正的16位/“字符”编码,因此只编码Unicode的“BMP”(基本多语言平面)部分,而UTF-16使用“代理对”(总共32位)来编码高于BMP的字符。)

答案 1 :(得分:2)

扩展@Kevin的回答:

描述是微软的帮助已经过时了,它描述了NT 3.5 / 4.0时间轴中的世界状态。

你也会偶尔看到提到的UTF-32和UCS-4,最常见的是* nix世界。 UTF-32是Unicode的32位编码,是UCS-4的子集。 Unicode Standard Annex #19描述了它们之间的差异。

我发现描述各种编码模型的最佳参考是Unicode Technical Report #17 Unicode Character Encoding Model,尤其是第4节中的表格。

答案 2 :(得分:0)

  

65536个可能的角色是否能够代表这个世界上的所有语言?

没有

  

为什么这个概念在Web开发人员社区和桌面开发人员社区中看起来有所不同?

因为Windows文档错误。我花了一段时间来弄明白这一点。 MSDN至少在两个地方说Unicode是16位编码:

混淆的一个原因是Unicode在某一点上是16位编码。来自Wikipedia

  

“最初,Unicode和ISO 10646标准都是固定宽度的,Unicode是16位”

另一个问题是,今天在Windows API中,包含utf-16编码字符串数据的字符串通常使用宽字符数组表示,每个字符长度为16位。尽管Windows API支持两个16位字符类型的代理对,但代表一个Unicode代码点。

查看this blog post以获取有关混淆来源的更多详细信息。