zoukankan      html  css  js  c++  java
  • 将ASCII字符串转换为UNICODE字符串

    写在前面的话:在MFC的网络编程中,由于现在项目都是使用UNICODE编码,但是网络API的许多函数却只能接受const char*的参数,所以经常会遇到需要将char*转换为TCHAR*的时候,有一个函数可以实现,但是用起来比较麻烦,所以自己就对它进行了封装,形成自己的函数,记下来,以备后用。

    函数很简单,代码如下:

    1 TCHAR* CServerDlg::AsciiToUnicode(char *str)
    2 {
    3     DWORD dwNum = 0;
    4     dwNum = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
    5     TCHAR* pwHostName = new TCHAR[dwNum];
    6     MultiByteToWideChar(CP_ACP, 0, str, -1, pwHostName, dwNum);
    7     return pwHostName;
    8 }

    使用此函数时,只需要传入需要转换的char数组就可以了,返回一个TCHAR*的指针,需要注意的是,因为返回的是一个指向动态生成的字符数组,因此在得到返回值之后应该立刻拷贝下来,然后将指针指向的内存区销毁,以免造成内存泄漏,用C++最需要注意这一点了,一不小心就会内存泄漏。

     补充:

    cstdlib中也提供了编码转换函数,如下:

    mbtowc : 将多字节字符转换为wchar_t

    wctomb : 将wchar_t转换为多字节字符

    mbstowcs : 将多字节字符串转换为wchar_t字符串

    wcstombs : 将wchar_t字符串转换为多字节字符串

    当然UNICODE字符集同多字节字符集之间的转换还可以使用windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数原型如下:

     1 int WideCharToMultiByte(
     2     UINT CodePage,
     3     DWORD dwFlags,
     4     LPCWSTR lpWideCharStr,
     5     int cchWideChar,
     6     LPSTR lpMultiByteStr,
     7     int cbMultiByte,
     8     LPCSTR lpDefaultChar,
     9     LPBOOL lpUserDefaultChar
    10 );
    11 
    12 int MultiByteToWideChar(
    13     UINT CodePage,
    14     DWORD dwFlags,
    15     LPCSTR lpMultiByteStr,
    16     int cbMultiByte,
    17     LPWSTR lpWideCharStr,
    18     int cchWideChar
    19 );

    通常我们在使用时不知道转换后的字符串会占多大字节,所以可以先将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte和MultiByteToWideChar函数,它们返回值即为目标字符串的字节大小,然后利用该大小作为参数cbMultiByte,再次调用函数即可。

  • 相关阅读:
    9IDEA常见的快捷键
    8Java类与对象
    5Java运算符
    10Java面向对象中级
    3Java基础
    4Java基础变量
    6Java控制结构
    7Java数组
    11Java面向对象高级
    缓存事件过期监听机制
  • 原文地址:https://www.cnblogs.com/lit10050528/p/3656142.html
Copyright © 2011-2022 走看看