Multibyte 和 WideChar 的区别

抽象上来讲:

Multibyte 字符集 是一个其中既包含一个字节宽的字符,又包含多个字节宽的字符的字符集。一个Multibyte字符集可能既包含ANSI单字节字符,又包含DBCS双字节字符。

WideChar在每个字符的大小上都相当于两个字节,能容纳一个标准UTF-16编码的宽字符。

 

那么具体什么是ANSI/DBCS/UTF……

ANSI字符集是早期美国国家标准协会指定的单字节字符标准,即每个字符的长度都为一个字节。而文本字符串也就是由以\0结尾的单字节ANSI字符组成,也成为ANSI字符数组。

DBCS(double-byte character set) 则成为双字节字符,其中每个字符有两个字节组成。之所以出现DBCS是因为,很多英文外的语言符号集包含的符号很复杂(例如中文、日文等)单字节不足以完全表示其中的字符。于是产生了双字节字符。

 

那么UTF是什么呢? 

这就又得从Unicode说起。

Unicode的产生起初是为了统一单双字节字符。因为在一个文字系统中,很多情况下既存在单字节字符,又存在双字节字符(所谓的Multibyte),由于双字节字符有的也只有一个字节宽,于是这样 一个字节、两个字节、一个字节、两个字节…混在一起很不利于程序员处理,就催生了整齐划一的Unicode。

Unicode实在88年由Apple、Xerox联合建立的,为的就是Multibyte的统一。而大名鼎鼎的UTF就是Unicode Transformation Format是一种Unicode的转换格式。其中在很多系统(例如windows 10)默认编码格式都为UTF-16(以为每个字符都是16为)也就是两个字节宽,也因此称为宽字符(WideChar);因此在进行Windows开发时常遇到将其他字符格式转换为Unicode的过程。

 

ANSI/Multibyte 转 WideChar

由于Windows系统中默认的编码格式为Unicode格式,所以在进行windows编程的时候,往往就需要将其他类型的格式(例如单字符或者混合字符)转为Unicode(Widechar)宽字符格式。

下面介绍一种小编在常用的 紧急Unicode转multibyte char*的方法:

//需要#include <comdef.h>

1 _bstr_t b(xxxUnicode);
2 char* xxxChar = b; 
3 //具体项目中的例子
//AppName是一个WideChar字符串变量
//而传参的时候只能是ANSI短字符 4 CString AppName; 5 _bstr_t b(AppName); 6 char* AppName_a = b; 7 new_OpenApp(new_DevHandle, AppName_a, &AppHandle);
posted @ 2019-12-25 09:39  Genius⋅Tintin  阅读(598)  评论(0编辑  收藏  举报