MultiByteToWideChar 和WideCharToMultiByte的使用

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* 指针来存储数据,但觉得指针。。。就没用。

你可能感兴趣的:(MultiByteToWideChar 和WideCharToMultiByte的使用)