Visual c++ Unicode和多字节文章的混淆

Visual c++ Unicode和多字节文章的混淆,visual-c++,unicode,internationalization,Visual C++,Unicode,Internationalization,通过引用 有些人在政府的控制之下 对Unicode仅仅是一个 每个字符所用的16位代码 16位,因此有65536位 可能的字符。这不是,, 事实上,没错 读完整篇文章后,我的观点是,如果有人告诉你,他的文本是unicode的,你将不知道他的每个字符占用了多少内存空间。他必须告诉你,“我的unicode文本是用UTF-8编码的”,那么只有你知道他的每个字符占用了多少内存空间 Unicode=每个字符不需要2个字节 然而,说到和,这让我很困惑: 微软: Unicode是一个16位字符 编码,提供足

通过引用

有些人在政府的控制之下 对Unicode仅仅是一个 每个字符所用的16位代码 16位,因此有65536位 可能的字符。这不是,, 事实上,没错

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

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


然而,说到和,这让我很困惑:

微软:

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


代码项目:

Unicode字符集是“宽”字符集 字符集“(每个字符2字节) 包含每个字符的 提供各种语言版本,包括 所有技术符号和特殊符号 发布字符。多字节 字符集(MBCS)使用1或 每个字符2字节

Unicode=每个字符2个字节?

65536个可能的字符能够代表世界上所有的语言吗

为什么web开发者社区和桌面开发者社区的概念看起来不同?

很久以前

  • 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字符以上。)

扩展@Kevin的答案:

描述是微软的帮助已经过时了,在NT3.5/4.0时间表中描述了世界的状态

您还会偶尔看到UTF-32和UCS-4也被提到,在*nix世界中最常见。UTF-32是UCS-4的一个子集的32位编码。描述了它们之间的区别

我发现描述各种编码模型的最佳参考是,尤其是第4节中的表

65536个可能的字符能够代表世界上所有的语言吗

没有

为什么web开发者社区和桌面开发者社区的概念看起来不同

因为Windows文档是错误的。我花了一段时间才弄明白。MSDN至少在两个地方指出Unicode是一种16位编码:

造成混乱的一个原因是Unicode一度是16位编码。发件人:

最初,Unicode和ISO10646标准都是固定宽度的,Unicode为16位

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


查看有关混淆来源的更详细信息。

OK。因此,在上面的内容中,unicode表示“以UTF-16编码的unicode”,它不需要每个字符16位,而且可以超过16位。我说的对吗?UTF-16确实不是固定宽度编码,因为它使用了代理对您必须从其他来源或实验中确定他们称为“Unicode”的数据实际上是UTF-16(可以有替代项并表示所有Unicode)还是UCS-2(不能有替代项;只能表示Unicode的BMP部分)。-我没有关于术语“MBCS”的信息。唯一正确的建议是Unicode是一组代码点。UCS-2或UTF-16是这些代码点的编码。然后读取代码点,并在屏幕上显示为字符。虽然简体中文中的一个字符可能由许多代码点组成,但Utf-16取代了UCS-2(不是同一件事)。