一、多字符与宽字符
1. 电脑发展的初期
ASCII编码,每个字符占一个字节,最多只能表示256个字符。
汉字等字符采用两个字节共同表示一个汉字的方法。二个字节理论上可以表示65535个字符。
因为ASCII标准是用一个字节的7个位表示一个普通字符,最高位为0(如字母“A”的二进制01000001),所以表示汉字就采用最高位为1来表示。如“中”字就是用0xD6、0xD0表示(二进制11010110、11010000)。
程序员判断一个字符是否为汉字,就是通过最高位是否为1来判断的。
ASCII编码字符,叫多字节字符
2. UNICODE编码,每个字符占二个字节。也叫万国码(一种国际标准字符集,为世界上绝大多数已知的字符集定义了唯一的16位数值)
UNICODE编码的数字、字母等,保留原ASCII的8位编码,后面加上八个二进制0。
中国国家标准的UNICODE编码汉字,叫GB18030(与UNICODE相同,2002年开始执行),有27533个汉字。
UNICODE编码字符,叫宽字节字符。
二、相互间转换的函数
1.MultiByteToWideChar函数
函数功能:该函数将一个字符串到转换成一个宽字符(unicode)的字符串。
函数原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
第一个参数CodePage:指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。
CP_ACP:ASCII字符集;
CP_UTF7:使用UTF-7转换;
CP_UTF8:使用UTF-8转换;
第二个参数dwFlags:一般用 0 就可以了
第三个参数lpMultiByteStr: ASCII 字符串的地址, 这个字符串是第一个参数指定的语言的 ASCII 字符串 (ASCIIString)
第四个参数cchMultiByte: ASCII 字符串的长度,如果用 -1, 就表示是用 0 作为结束符的字符串
第五个参数 lpWideCharStr,:转化生成的 unicode 字符串 (WideString) 的地址, 如果为 NULL, 就是代表计算生成的字符串的长度
第六个参数cchWideChar:转化生成的 unicode 字符串缓存的容量,也就是有多少个UNICODE字符,若此值为零,函数将返回缓冲区所必需的宽字符数。
因此该函数一般使用两次:
第一次获取转换成unicode所需要的长度
第二次才是真正的把一个字符串转换为unicode,代码如下:
char* mbs = "中国,你好!I Love You!";
int length = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 );
wchar_t* wcs = new wchar_t[ length ];
MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, length );
delete wcs;
wcs = NULL;
2.WideCharToMultiByte 函数
函数功能:该函数将一个宽字符(unicode)转换为字符串的函数。
函数原形:
int WideCharToMultiByte(
UINT CodePage, //指定执行转换的代码页
DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符,一般设置为NULL
LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区
int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数
LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区
int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值
LPCSTR lpDefaultChar, //当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在CodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。
LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
);
代码如下:
Wchar_t* wcs = _T("中国,你好!I Love You!");
int length = WideCharToMultiByte( CP_ACP, 0, wcs, -1, NULL, 0, NULL, NULL);
char* mbs = new char[ length ];
WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, length, NULL, NULL);
delete mbs;
mbs = NULL;
三、char与string的区别与转换
1、char是字符类型
2、string是字符串类型
虽然一字之差,但其本质是很大的。
1. char属于基础类型(C++),char类型的长度是固定的,C++中它是1个字节(Unicode Char即WCHAR为2个字节)。
2. string是一个模板类型,也就是一个class,和容器差不多。string的长度是无法通过sizeof来取得,因为它不是一个基础类型,它本身并不固定长度,而取决于内部包含的字符。它包含以下一些函数:
1) size(),length() //返回字符数量
2)empty() //判断字符串是否为空
3)clear() //删除全部字符
4) data() //返回String中的字符,为const
5)copy()//将String中的字符拷贝到char*中
下面通过代码看string与char间的转换: