wchar_t 介绍

  • wchar_t 是 C 和 C++ 编程语言中的一种基本数据类型,用于存储宽字符。它是"wide character"的缩写,设计初衷是为了支持多语言环境,特别是那些使用Unicode或其它多字节字符集的语言,如中文、日文、韩文等。
  • char占用一个字节,只能表示256个字符。而wchar_t占用两个字节,可以表示65536个字符。

wchar_t 赋值

  • wchar_t 赋值时在字符前加上L前缀来指示这是一个宽字符或宽字符串
  •   wchar_t wstr1 = L'A';
      wchar_t *wstr2 = L"Hello World wstr2";
      wchar_t wstr3[] = L"Hello World wstr3";
    
  • 也可以通过TEXT宏来进行赋值,一般用在使用Unicode编码的工程中,根据是否定义了Unicode,TEXT会判断是否在字符串前加上L
  •   wchar_t wstrt[] = TEXT("Hello World TEXT");
    

LPWSTR 与 LPSTR

  • LPWSTR 是 wchar_t*, LPCWSTR 是const wchar_t*
  • LPSTR 是 char*, LPCSTR 是const char*
  • 官方定义如下
  •   typedef wchar_t* LPWSTR;
      typedef const wchar_t* LPCWSTR;
      typedef char* LPSTR;
      typedef const char* LPCSTR;
    

LPWSTR(wchar_t*)与LPSTR(char*)互相转换

相关API

  •   /*
      *  @brief  将宽字节字符串转换为多字节字符串
      *  @param  [IN]  CodePage           要转换到的多字节字符集的代码页
      *                                       CP_ACP  - ANSI编码
      *                                       CP_UTF8 - UTF-8编码
      *  @param  [IN]  dwFlags            控制转换行为的标志,一般设置为0
      *  @param  [IN]  lpWideCharStr      指向要转换的宽字节字符串的指针
      *  @param  [IN]  cchWideChar        要转换的宽字节字符串的大小
      *  @param  [OUT] lpMultiByteStr     指向输出的多字节字符缓冲区的指针
      *  @param  [IN]  cbMultiByte        指定lpMultiByteStr缓冲区的大小
      *  @param  [IN]  lpDefaultChar      可设置为NULL
      *  @param  [OUT] lpUsedDefaultChar  可设置为NULL
      *  @return 成功时返回转换后字符串的实际字节数,失败时返回0
      */
      int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, 
                          int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar);
    
      /*
      *  @brief  将多字节字符串转换为宽字节字符串
      *  @param  [IN]  CodePage           要转换到的多字节字符集的代码页
      *                                       CP_ACP  - ANSI编码
      *                                       CP_UTF8 - UTF-8编码
      *  @param  [IN]  dwFlags            控制转换行为的标志,一般设置为0
      *  @param  [IN]  lpMultiByteStr     指向要转换的多字节字符串的指针
      *  @param  [IN]  cbMultiByte        要转换的多字节字符串的大小
      *  @param  [OUT] lpWideCharStr      指向输出的宽字节字符缓冲区的指针
      *  @param  [IN]  cchWideChar        指定lpWideCharStr缓冲区的大小
      *  @return 成功时返回转换后字符串的实际字节数,失败时返回0
      */
      int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
    

编程示例

  •   #include <iostream>
      #include <windows.h>
    
      int Wchar2Char(wchar_t* wcharStr, char* charStr);
      int Char2Wchar(char* charStr, wchar_t* wcharStr);
    
      int main(){
          // wchar_t* -> char*
          wchar_t* wcharStrA = L"Hello World A";
          char charStrA[1024] = { 0 };
          Wchar2Char(wcharStrA, charStrA);
    
          // char* -> wchar_t*
          wchar_t wcharStrB[1024] = L"";
          char charStrB[] = "Hello World B";
    
          Char2Wchar(charStrB, wcharStrB);
    
          system("pause");
          return 0;
      }
    
      int Wchar2Char(wchar_t* wcharStr, char* charStr){   
          int len = WideCharToMultiByte(CP_ACP, 0, wcharStr, wcslen(wcharStr), NULL, 0, NULL, NULL);    
          WideCharToMultiByte(CP_ACP, 0, wcharStr, wcslen(wcharStr), charStr, len, NULL, NULL);     
          charStr[len]= '\0'; 
          return len; 
      }
    
      int Char2Wchar(char* charStr, wchar_t* wcharStr){
          int len = MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), NULL, 0);
          MultiByteToWideChar(CP_ACP, 0, charStr, strlen(charStr), wcharStr, len);     
          wcharStr[len]= '\0' ;    
          return len;
      }
    
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐