关于宽字符与多字符、char与string的问题

一、多字符与宽字符

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 CharWCHAR为2个字节)。
2. string是一个模板类型,也就是一个class,和容器差不多。string的长度是无法通过sizeof来取得,因为它不是一个基础类型,它本身并不固定长度,而取决于内部包含的字符。它包含以下一些函数:

1 size(),length()    //返回字符数量

2)empty()    //判断字符串是否为空

3)clear() //删除全部字符

4) data() //返回String中的字符,为const

5)copy()//将String中的字符拷贝到char*中

下面通过代码看string与char间的转换:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值