我正在阅读关于Windows上的字符集和编码的文章。我注意到Visual编译器(用于C++)中有两个名为MBCS和UNICODE的编译器标志。他们之间有什么区别?我没有得到的是,UTF-8在概念上与MBCS编码有何不同?另外,我在MSDN中找到了以下引文
Unicode是一种16位字符编码。
这否定了我所读到的关于Unicode的任何东西。我认为unicode可以用不同的编码方式进行编码,比如UTF-8和UTF-16。有人能再解释一下这种混乱吗?
发布于 2012-10-22 12:14:45
_MBCS和_UNICODE是用来确定要调用哪个版本的TCHAR.H例程的宏。例如,如果使用_tcsclen来计算字符串的长度,则预处理程序将根据两个宏:_MBCS和_UNICODE将_tcsclen映射到不同的版本。
_UNICODE & _MBCS Not Defined: strlen
_MBCS Defined: _mbslen
_UNICODE Defined: wcslen 要解释这些字符串长度计数函数的区别,请考虑下面的示例。
如果您有一个运行使用GBK(936代码页)的Windows简体中文版本的计算机框,则编译一个gbk文件编码的源文件并运行它。
printf("%d\n", _mbslen((const unsigned char*)"I爱你M"));
printf("%d\n", strlen("I爱你M"));
printf("%d\n", wcslen((const wchar_t*)"I爱你M"));结果是4 6 3。
以下是I爱你M在GBK中的六进制表示形式。
GBK: 49 B0 AE C4 E3 4D 00 _mbslen知道这个字符串是用GBK编码的,所以它可以正确地对字符串进行整数处理,并得到正确的结果4单词:49作为I,B0 AE作为爱,C4 E3作为你,4D作为M。
斯特伦只知道0x00,所以它得到了6。
wcslen认为这个六分贝数组是用UTF16LE编码的,它把两个字节算作一个字,所以它得到3字:49 B0、AE C4、E3 4D。
正如@xiaokaoy所指出的,wcslen的唯一有效终止符是00 00。因此,如果下面的字节不是3,则结果不会成为00。
发布于 2010-07-21 11:17:52
MBCS的意思是http://en.wikipedia.org/wiki/Multi-byte_character_set,并描述将字符编码为(可能)超过1字节的任何字符集。
ANSI / ASCII字符集不是多字节的.
然而,UTF-8是一种多字节编码.它将任何Unicode字符编码为1、2、3或4个八进制(字节)序列。
然而,UTF-8只是Unicode字符集几个可能的具体编码中的一个。值得注意的是,UTF-16是另一种,它恰好是由Windows / .NET (IIRC)使用的编码。以下是UTF-8和UTF-16之间的区别:
因此,Unicode是16位字符编码是不正确的.这有点像21位编码(或者现在更多),因为它包含一个字符集,代码点U+000000一直到U+10FFFF。
发布于 2013-05-12 01:21:31
作为其他答案的一个脚注,MSDN有一个文档TCHAR.H中的泛型文本映射,其中有一些简单的表,总结了预处理程序指令_UNICODE和_MBCS如何更改不同C/C++类型的定义。
至于"Unicode“和"Multi-Byte字符集”这两个词,人们已经描述了其效果。我只想强调,这两者都是微软的--表达一些非常具体的东西。(也就是说,如果不是微软对文本国际化的理解,它们就意味着一些不那么一般的、对Windows更特殊的东西。)这些确切的短语会出现,并且倾向于获得微软技术文档中各自独立的部分/子部分,例如在Visual C++中的文本和字符串中。
https://stackoverflow.com/questions/3298569
复制相似问题