zoukankan      html  css  js  c++  java
  • C++ 宽字符(wchar_t)与窄字符(char)的转换

    了解

    长度

    宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字,

    窄字符    char   的长度  8 位,只能处理英文。

    哪里可以见到

    在VS2010, 2012, 2013集成环境下面创建win32控制台工程后可以看到一个叫做 _tmain的主函数,其参数— int argc, _TCHAR* argv[],查看定义_TCHAR的定义就是wchar_t。

    无标题

    另外关于_tmain与main的区别,请看_tmain()和main()区别—lucyjiayou

    转换函数

    头文件 #include <stdlib>

    函数原型

    //宽字符转换为窄字符

    errno_t wcstombs_s(
       size_t *pReturnValue, //被修改的位数,作为返回的
       char *mbstr,          //转换后字符串(窄)的空间指针
       size_t sizeInBytes,   //我暂时理解为,允许操作窄字符缓冲区的字符的个数,
                             //要比count大1,不能大过缓冲区最大长度
       const wchar_t *wcstr,  //指向要转换的宽字符字符串
       size_t count ) ;         //要转换的宽字符的个数;
     
    //窄字符转换为宽字符
    errno_t mbstowcs_s(
       size_t *pReturnValue, //被修改的位数,作为返回的 
       wchar_t *wcstr,       //转换后宽字符串的缓冲区指针
       size_t sizeInWords,   // 允许操作缓冲区中宽字符的个数
       const char *mbstr,    //指向要转换的窄字符的字符串
       size_t count          //要转换的窄字符的个数
    );

    操作

    将宽字节的字符串转换为窄字符的字符串

       1:  #include <string>
       2:  #include <cstdlib>
       3:   
       4:  std::string ws2s(const std::wstring& ws)
       5:  {
       6:      std::string curLocale = setlocale(LC_ALL, NULL);        // curLocale = "C";
       7:      setlocale(LC_ALL, "chs");                                             //中文地区
       8:      const wchar_t* _Source = ws.c_str();
       9:      size_t _Dsize =  ws.size() + 1;                                    //比要转换的宽字符个数大1
      10:      char *_Dest = new char[_Dsize];
      11:      memset(_Dest, 0, _Dsize);                                          //初始化缓冲区
      12:      size_t   i;
      13:      wcstombs_s(&i, _Dest, _Dsize, _Source, ws.size());
      14:      std::cout << "i:" << i << std::endl;                          
      15:      std::string result = _Dest;
      16:      delete[]_Dest;
      17:      setlocale(LC_ALL, curLocale.c_str());                               //设置回原来的locale
      18:      return result;
      19:  }

    将窄字节的字符串转换为宽字符的字符串

       1:  std::wstring s2ws(const std::string& s)
       2:  {
       3:      std::string curlLocale = setlocale(LC_ALL,NULL);
       4:      setlocale(LC_ALL, "chs");
       5:      const char* _Source = s.c_str();
       6:      size_t _Dsize = s.size() + 1;
       7:   
       8:      wchar_t* _Dest = new wchar_t[_Dsize];
       9:      size_t i;
      10:      mbstowcs_s(&i, _Dest, _Dsize, _Source, s.size());
      11:      std::wstring result = _Dest;
      12:      delete[] _Dest;
      13:      setlocale(LC_ALL, curlLocale.c_str());
      14:      return result;
      15:  }

    注意:窄字符与宽字符转换时要注意locale的转换,保存,与还原。

  • 相关阅读:
    一个列表如何根据另一个列表进行排序(数组的相对排序)
    汉诺塔问题
    python面向对象基础
    python爬虫
    软件开发目录规范
    python--->包
    编译python文件
    python文件的俩种用途
    python模块的搜索路径
    python 循环导入的问题
  • 原文地址:https://www.cnblogs.com/claruarius/p/kuanzifu.html
Copyright © 2011-2022 走看看