将ASCII字符串转换为UNICODE字符串
2014-04-10 11:50
357 查看
写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一个函数可以实现,但是用起来比较麻烦,所以自己就对它进行了封装,形成自己的函数,记下来,以备后用。
函数很简单,代码如下:
使用此函数时,只需要传入需要转换的char数组就可以了,返回一个TCHAR*的指针,需要注意的是,因为返回的是一个指向动态生成的字符数组,因此在得到返回值之后应该立刻拷贝下来,然后将指针指向的内存区销毁,以免造成内存泄漏,用C++最需要注意这一点了,一不小心就会内存泄漏。
补充:
cstdlib中也提供了编码转换函数,如下:
mbtowc : 将多字节字符转换为wchar_t
wctomb : 将wchar_t转换为多字节字符
mbstowcs : 将多字节字符串转换为wchar_t字符串
wcstombs : 将wchar_t字符串转换为多字节字符串
当然UNICODE字符集同多字节字符集之间的转换还可以使用windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数原型如下:
通常我们在使用时不知道转换后的字符串会占多大字节,所以可以先将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte和MultiByteToWideChar函数,它们返回值即为目标字符串的字节大小,然后利用该大小作为参数cbMultiByte,再次调用函数即可。
函数很简单,代码如下:
TCHAR* CServerDlg::AsciiToUnicode(char *str) { DWORD dwNum = 0; dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); TCHAR* pwHostName = new TCHAR[dwNum]; MultiByteToWideChar(CP_ACP, 0, str, -1, pwHostName, dwNum); return pwHostName; }
使用此函数时,只需要传入需要转换的char数组就可以了,返回一个TCHAR*的指针,需要注意的是,因为返回的是一个指向动态生成的字符数组,因此在得到返回值之后应该立刻拷贝下来,然后将指针指向的内存区销毁,以免造成内存泄漏,用C++最需要注意这一点了,一不小心就会内存泄漏。
补充:
cstdlib中也提供了编码转换函数,如下:
mbtowc : 将多字节字符转换为wchar_t
wctomb : 将wchar_t转换为多字节字符
mbstowcs : 将多字节字符串转换为wchar_t字符串
wcstombs : 将wchar_t字符串转换为多字节字符串
当然UNICODE字符集同多字节字符集之间的转换还可以使用windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数原型如下:
int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUserDefaultChar ); int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );
通常我们在使用时不知道转换后的字符串会占多大字节,所以可以先将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte和MultiByteToWideChar函数,它们返回值即为目标字符串的字节大小,然后利用该大小作为参数cbMultiByte,再次调用函数即可。
相关文章推荐
- MyEclipse搭建struts框架,并且实现登陆流程和拦截器使用
- hdu 3966 Aragorn's Story (树链剖分)
- 四月份任务单
- Unity3d 面向对象设计思想(三)(对象的拆分)
- 最简单的动态规划之POJ1063
- 软件开发--数据库中字段长度是不是越大越好?
- 浅谈日本游戏产业不断衰落的原因
- Java线程静态在对象缓存中的妙用
- jsp页面往mysql里插入中文后数据库里显示乱码
- Oracle导入导出数据库(含远程导入导出数据库)
- linux系统定时重启tomcat
- oracle 11g 修改默认端口
- 黑马程序员:Objective-C 字符串各种处理
- Android4.0-Fragment框架实现方式剖析
- CSS 不换行 white-space 属性详解
- Solr开发
- Android复习之文本框TextView
- POJ 3299 Humidex 减半递推
- 五个给你网站增加网站流量的方法
- 大数相加