2010-03-10 70 views
5

我以前是混淆相当长的一段:什么是当前现代术语“多字节字符集”

Confusion on Unicode and Multibyte Articles

所有贡献者读了评论之后,加:

看着一个老的文章(2001年度):http://www.hastingsresearch.com/net/04-unicode-limitations.shtml,其中谈论的Unicode:

是一个16位字符定义 允许西奥总计超过 65,000个字符。然而,世界 的完整字符集合 合计超过170,000个字符。

,并在当前的“现代”的文章展望:http://en.wikipedia.org/wiki/Unicode

最常用的编码是 UTF-8(使用1个字节为所有 ASCII字符,它们具有相同的 码值如在标准的ASCII 编码中,以及对于其他 字符最多4字节),现在已经过时的UCS-2 (其对所有 字符使用2个字节,但不包括Unicode sta中的每个 字符ndard), 和UTF-16(其扩展了UCS-2,使用 4个字节来编码来自UCS-2的缺少 的字符)。

似乎在VC2008的编译选项,选项 “统一” 下的字符集的真正含义 “的Unicode编码在UCS-2”(或UTF-16?我不知道)

我尝试下VC2008

#include <iostream> 

int main() 
{ 
    // Use unicode encoded in UCS-2? 
    std::cout << sizeof(L"我爱你") << std::endl; 
    // Use unicode encoded in UCS-2? 
    std::cout << sizeof(L"abc") << std::endl; 
    getchar(); 

    // Compiled using options Character Set : Use Unicode Character Set. 
    // print out 8, 8 

    // Compiled using options Character Set : Multi-byte Character Set. 
    // print out 8, 8 
} 

运行下面的代码来验证这一点,似乎与Unicode字符集选项编译过程中,其结果符合我的假设。

但是多字节字符集呢?多字节字符集在当今“现代”世界中意味着什么? :)

+0

MBCS意味着什么。今天我们有Unicode。你所知道的所有信息都已消失(大部分)。 – 2010-03-10 03:15:03

+0

使用L宏会导致编译器将这两个字符串视为“宽字符串”,因此对您获得的结果(8,8)有意义。删除L会得到(7,4)的结果,按照Microsoft标准/耸耸肩 – YeenFei 2010-03-10 03:58:03

+0

@Pototoswatter:你在说什么?字符串文字具有数组类型,在本例中为'wchar_t const [4]'。当你解除引用时,数组首先衰减到'wchar_t const *'。取消引用反过来给你一个'wchar_t const'。因此,'* L“123456789”== L'1''和'sizeof(* L“123456789”)== sizeof(L'1')' – MSalters 2010-03-10 08:45:58

回答

6

http://en.wikipedia.org/wiki/Multi-byte_character_set

MBCS是用来表示一类的字符编码与不能与单个字节,因此多字节字符集表示的字符的术语。为了正确解码这种格式的字符串,你需要一个代码页,告诉你各种字节组合映射到字符。 ISO/IEC 8859定义了一组MBCS标准,但根据维基百科,ISO在2004年停止维护它们,大概是专注于Unicode。

所以我想MBCS的现代术语是“弃用Unicode”。

+0

+1。 MBCS是一组特定的编码,因此并不意味着“每个字符使用多个字节”的更一般情况。 Unicode,UTF8和UTF16不是“MBCS”,尽管它们以每个字符多字节编码。 – 2010-03-10 21:06:04

0

多字节表示一个字符存储在多个字节中。维基百科

提取物对UTF8:

UTF-8编码只对使用 在1至4个八位字节(8位字节), 与单个八位字节编码的每个字符(代码 点) 128个US-ASCII字符。

所以基本上,utf8是一个多字节字符集:-)。

+0

但是,如果您从http://msdn.microsoft.com/zh-cn/library/ey142t48%28VS.71%29.aspx#_core_mfc_support_for_mbcs_strings中读取,多字节字符需要“代码页”。但是,UTF-8不需要代码页。来自wp的 – 2010-03-10 03:17:33

+0

:“UTF-8使得程序很容易识别三种单元,因为它们是分开的。较老的可变宽度编码通常设计得不是很好,因为在它们中,跟踪单元和导向单元可以使用相同的值,并且在所有三种中使用重叠值。“我的解释:较旧的字符集需要代码页,utf8被设计为不需要它。 “Unicode通过支持更多的语言和字符使得代码页过时了” – 2010-03-10 03:19:38

+0

所以,这是否意味着我们不能说UTF8 = Microsoft的多字节字符? :) – 2010-03-10 03:23:02

0

多字节字符集是任何可以使用多于一个字节来编码字符的编码方案的通用术语。

当您听到该术语时,您通常会指望它是指“IBM EBCDIC cp1390 - 日文汉字多字节”中旧的旧字符集之一。

所有的UNICODE方案在技术上都是MBCS,但你可以期望它们被统称为“UNICODE”或UTF-8,UTF-16或UTF-32。

使用MBCS字符集的唯一“当前”软件是Microsoft Office套件。其中使用了“Windows MBCS”。除了一些细微差别外,这与utf-16几乎相同。由于Microsofts早期采用标准草案,完整标准的一小部分难以实现,所以它坚持使用术语“Windows MBCS”。

0

在MSVC中,字符集下的选项“Unicode”表示_T("X")扩展为L"X"。如果设置为MBCS,则_T("X")将扩大为"X"

另一个结果是Win32宏MessageBox()扩展为MessageBoxW()MessageBoxA,以及所有其他以A/W对形式出现的其他Win32函数的宏。

+0

但是没有说明使用的编码 – jalf 2010-03-11 05:19:18

+0

@jalf:是的。这适用于IDE设置,字符串的编译器解释和A/W功能选择。在所有三种情况下,区别是布尔值,并且未指定MBCS编码。 – MSalters 2010-03-11 10:04:53

0

似乎在VC2008的编译选项,下字符选项 “统一” 设定的真正含义 “的Unicode在UCS-2编码”(或UTF-16?我不知道)

它使用在Utf-16 LE中编码的Unicode。我链接到的维基百科文章对此有影响。

但是多字节字符集呢?多字节字符集在当今“现代”世界中意味着什么? :)

MBCS主要是used in the MSDN documentation to mean DBCS。这是explained in more detail in this blog post。如果你想避免混淆,你可以说“MBCS代码页”。