首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows环境下MBCS与UTF-8的区别

Windows环境下MBCS与UTF-8的区别
EN

Stack Overflow用户
提问于 2010-07-21 11:11:12
回答 3查看 41.3K关注 0票数 69

我正在阅读关于Windows上的字符集和编码的文章。我注意到Visual编译器(用于C++)中有两个名为MBCS和UNICODE的编译器标志。他们之间有什么区别?我没有得到的是,UTF-8在概念上与MBCS编码有何不同?另外,我在MSDN中找到了以下引文

Unicode是一种16位字符编码。

这否定了我所读到的关于Unicode的任何东西。我认为unicode可以用不同的编码方式进行编码,比如UTF-8和UTF-16。有人能再解释一下这种混乱吗?

EN

回答 3

Stack Overflow用户

发布于 2012-10-22 12:14:45

_MBCS和_UNICODE是用来确定要调用哪个版本的TCHAR.H例程的宏。例如,如果使用_tcsclen来计算字符串的长度,则预处理程序将根据两个宏:_MBCS和_UNICODE将_tcsclen映射到不同的版本。

代码语言:javascript
复制
_UNICODE & _MBCS Not Defined: strlen  
_MBCS Defined: _mbslen  
_UNICODE Defined: wcslen  

要解释这些字符串长度计数函数的区别,请考虑下面的示例。

如果您有一个运行使用GBK(936代码页)的Windows简体中文版本的计算机框,则编译一个gbk文件编码的源文件并运行它。

代码语言:javascript
复制
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中的六进制表示形式。

代码语言:javascript
复制
GBK:             49 B0 AE C4 E3 4D 00                

_mbslen知道这个字符串是用GBK编码的,所以它可以正确地对字符串进行整数处理,并得到正确的结果4单词:49作为IB0 AE作为C4 E3作为4D作为M

斯特伦只知道0x00,所以它得到了6

wcslen认为这个六分贝数组是用UTF16LE编码的,它把两个字节算作一个字,所以它得到3字:49 B0AE C4E3 4D

正如@xiaokaoy所指出的,wcslen的唯一有效终止符是00 00。因此,如果下面的字节不是3,则结果不会成为00

票数 20
EN

Stack Overflow用户

发布于 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之间的区别:

  • 8将任何Unicode字符编码为1、2、3或4个字节的序列。
  • UTF-16将大多数Unicode字符编码为2字节,有些编码为4字节。

因此,Unicode是16位字符编码是不正确的.这有点像21位编码(或者现在更多),因为它包含一个字符集,代码点U+000000一直到U+10FFFF

票数 11
EN

Stack Overflow用户

发布于 2013-05-12 01:21:31

作为其他答案的一个脚注,MSDN有一个文档TCHAR.H中的泛型文本映射,其中有一些简单的表,总结了预处理程序指令_UNICODE和_MBCS如何更改不同C/C++类型的定义。

至于"Unicode“和"Multi-Byte字符集”这两个词,人们已经描述了其效果。我只想强调,这两者都是微软的--表达一些非常具体的东西。(也就是说,如果不是微软对文本国际化的理解,它们就意味着一些不那么一般的、对Windows更特殊的东西。)这些确切的短语会出现,并且倾向于获得微软技术文档中各自独立的部分/子部分,例如在Visual C++中的文本和字符串中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3298569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档