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