MultiByteToWideChar 和WideCharToMultiByte的使用,其实就是ANSI 和UNICODE 之间的转换:
在vs2010 中,当在配置属性中设置字符集为“使用Unicode字符集时,那么你就选择了使用宽字符,使用宽字符还是有很多好处的,这个在《windows程序设计》中有讲到。
那么说下两个函数的使用:
1) MultiByteToWideChar 的使用
char *mChar = new char[strLen+1];
mChar 中存储的值为:
mChar[0] = 0x6e; ‘n'
mChar[1]=0x69; ‘i’
mChar[2]=0x68; ‘h’
mChar[3]=0x61; ‘a’
mChar[4]= 0x6f; ‘o’
mChar[5]=0xbb;
mChar[6]=0xb6; ”赵“
DWORD mNum = MultiByteToWideChar(CP_ACP,NULL,mChar,-1,NULL,0);
TCHAR *pwText;
pwText = new TCHAR[mNum];
MultiByteToWideChar(CP_ACP,NULL,mChar,-1,pwText,mNum);
2)WideCharToMultiByte 的使用
CString str = _T("nihao赵");
DWORD mNum = WideCharToMultiByte(CP_ACP,NULL,str,-1,NULL,0,NULL,FALSE);
char *mChar = new char[mNum];
WideCharToMultiByte(CP_ACP,NULL,str,-1,mChar,mNum,NULL,FALSE);
自己也写过类似的代码来完成这个过程,但是之前测试发现当从界面获得的串为汉字和字母混着时,计算长度会出错。
另记:
程序中需要将自绘图元存储到数据库中,用了_variant_t varBlob ,因此之前要将已有的图元信息转化为字节序列,在将文本类对象直接类型转换后存储,可是在取出时,由于CString类型的问题,无法得到,因此就想到了方法 :
一、将CString 的值单独转化为字节存储,然后再取出,给转换得到的类对象赋值,没有实现,原因:可存储,可取出,但是,当给有强制转换得到的类对象中的CString 赋值时,总是报错:
CStringData* pNewData = pStringMgr->Reallocate( pOldData, nLength, sizeof( XCHAR ) );
指到此处就无法运行,网上说是CString内存问题,具体自己也没找到解决办法。
二、既然是CString在类型转换时,出的问题,那么在存储和读取时,自己将这个类进行转换来实现的,虽然有些麻烦,但知道整个过程内存中都存了些什么,而且需要将含有CString 变量的类对象都要自己转化。其实之前也想过在类中声明char* 指针来存储数据,但觉得指针。。。就没用。