试试这个
C/C++ code
#include<comdef.h>char*str1="safdjkjlasfd";
_bstr str2=str1;
WCHAR*str3=str2;
// 宽字符转换单字符 string WideCharToMultiChar(wstring str) { string return_value; //获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的 int len=WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),NULL,0,NULL,NULL); char *buffer=new char[len+1]; WideCharToMultiByte(CP_ACP,0,str.c_str(),str.size(),buffer,len,NULL,NULL); buffer[len]='/0'; //删除缓冲区并返回值 return_value.append(buffer); delete []buffer; return return_value; } // 单字符转换宽字符 wstring MultCHarToWideChar(string str) { //获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的 int len=MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),NULL,0); TCHAR *buffer=new TCHAR[len+1]; //多字节编码转换成宽字节编码 MultiByteToWideChar(CP_ACP,0,str.c_str(),str.size(),buffer,len); buffer[len]='/0';//添加字符串结尾 //删除缓冲区并返回值 wstring return_value; return_value.append(buffer); delete []buffer; return return_value; }
手机使用ucs2格式,ucs2 是utf16 的big endian格式,平常在windows下称呼的unicode是utf16的little endian格式。
一个字符'1',其unicode值是0x0031, 0x0031仍然是0x31,在具体实现上,ucs2表示成两个字节0x00, 0x31,而pc机上表现库0x31, 0x00。本质上是一样的。
Windows环境下,用C实现UCS2编码和解码的算法如下: // UCS2编码 // pSrc: 源字符串指针 // pDst: 目标编码串指针 // nSrcLength: 源字符串长度 // 返回: 目标编码串长度 int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 字符串--> UNICODE串 nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128); // 高低字节对调,输出 for(int i=0; i <nDstLength; i++) { // 先输出高位字节 *pDst++ = wchar[i] > > 8; // 后输出低位字节 *pDst++ = wchar[i] & 0xff; } // 返回目标编码串长度 return nDstLength * 2; } // UCS2解码 // pSrc: 源编码串指针 // pDst: 目标字符串指针 // nSrcLength: 源编码串长度 // 返回: 目标字符串长度 int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength) { int nDstLength; // UNICODE宽字符数目 WCHAR wchar[128]; // UNICODE串缓冲区 // 高低字节对调,拼成UNICODE for(int i=0; i <nSrcLength/2; i++) { // 先高位字节 wchar[i] = *pSrc++ < < 8; // 后低位字节 wchar[i] |= *pSrc++; } // UNICODE串--> 字符串 nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL); // 输出字符串加个结束符 pDst[nDstLength] = '/0 '; // 返回目标字符串长度 return nDstLength; }