有些人是在 错误地认为Unicode只是一个 每个字符占用的16位代码 16位,因此有65,536 可能的人物。这不是, 实际上,正确。
在阅读完整篇文章之后,我的观点是,如果有人告诉你,他的文字是unicode,你将不知道他的每个角色占用了多少内存空间。他必须告诉你,“我的unicode文本是用UTF-8编码的”,然后只有你知道他的每个角色占用了多少内存空间。
Unicode =每个字符不需要2个字节
然而,当来到Code Project's Article和Microsoft's Help时,这让我很困惑:
微软:
Unicode是一个16位字符 编码,提供足够的编码 适用于所有语言。所有ASCII 字符包含在Unicode中 “加宽”的角色。
代码项目:
Unicode字符集是“广泛的 字符“(每个字符2个字节)设置 包含每个角色 提供各种语言,包括 所有技术符号和特殊 出版人物。多字节 字符集(MBCS)使用1或 每个字符2个字节
Unicode =每个字符2个字节?
65536个可能的角色是否能够代表这个世界上的所有语言?
为什么这个概念在Web开发人员社区和桌面开发人员社区中看起来有所不同?
答案 0 :(得分:11)
曾几何时,
这些因素导致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以获取有关混淆来源的更多详细信息。