了解

长度

宽字符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的转换,保存,与还原。

转载于:https://www.cnblogs.com/claruarius/p/kuanzifu.html

C++ 宽字符(wchar_t)与窄字符(char)的转换相关推荐

  1. 宽字符wchar_t和窄字符char区别和相互转换

    转自:http://blog.csdn.net/nodeathphoenix/article/details/7416725 1.    首先,说下窄字符char了,大家都很清楚,就是8bit表示的b ...

  2. C++ 宽字符 窄字符 char wchar

    目录 wchar_t和char区别 宽字符 string和wstring的区别 wchar_t和char区别 参考链接 宽窄字符是与一个字符所占的字节数有关,如果一个字符只占一个字节,那么它就是窄字符 ...

  3. Windows核心思想-宽字符与窄字符(Unicode和ASCII)

    目录 基本概念 演示 基本概念 宽字符:Unicode字符,双字节 窄字符:ASCII字符,单字节 Windows中所有的底层函数都是Unicode编码 COM组件必须使用Unicode编码(COM组 ...

  4. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  5. C++ 宽、窄字符转换

    目录 locale setlocale函数 设置字符编码 单字符宽字符互相转换 mbstowcs函数 wcstombs函数 mbtowc函数 wctomb函数 宽.窄字符转换总结 查看本文前先弄清字符 ...

  6. volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

     1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...

  7. wchar 格式控制符_控制台输出宽字符wchar_t的中文显示问题

    在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行).对于wcout,需要将其locale设为本地语言才能输出中文: wcout输出时显示不了中文, ...

  8. C语言指针-字符指针整型指针char*s int*a

    案例代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {//字符指针cha ...

  9. java编程规范每行代码窄字符,wiki/0xFE_编程规范.md at master · islibra/wiki · GitHub

    0xFE_编程规范 使用UTF-8编码 使用空格缩进 命名 清晰表达意图, 少用缩写(行业通用除外, 如: request=req, response=resp, message=msg), 不应使用 ...

最新文章

  1. 如何知道react对象的值_基于react怎么获取兄弟元素的对象或它的值?
  2. 15. 三数之和(双指针)
  3. bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
  4. java二次开发浏览器内核_深入理解基于Selenium的二次开发
  5. Javascript判断object还是list/array的类型(包含javascript的数据类型研究)
  6. 官方再曝vivo X30系列拍照新技能:主角光环不虚焦
  7. Oracle默认的用户名和密码
  8. Linux下vim常用操作
  9. R语言快速深度学习进行回归预测(转)
  10. 【java】彩票中奖码生成器:java.util.Random里的方法public int nextInt(int bound)
  11. 线性混合模型及R实现
  12. mysql 5.6 cmake 参数_编译cmake MySQL 5.6.10报错
  13. 设计-前端设计尺寸与规范
  14. web前端网页设计期末课程大作业:中华传统文化题材网页源码——基于HTML实现中国水墨风书画艺术网站(12个页面)
  15. 2020十大高薪岗位出炉,程序员霸榜
  16. kali获取同局域网设备的图片信息
  17. Hackthebox(1)系列持续更新
  18. iTRON新闻大集合
  19. 无法启动此程序因为计算机丢失zlib.dll,zlib1.dll怎么修复?zlib1.dll丢失解决方法及注意事项...
  20. 揭秘广告软文的五种写法

热门文章

  1. 二分图的最大匹配—匈牙利算法
  2. next_permutation函数
  3. const应用和作用
  4. javac,使用-d .与省略-d的区别
  5. 记mac电脑下pycharm配置qt-creator开发环境
  6. 《我在51CTO微职位学软考——奋发之路》
  7. 系统自动化安装kickstart
  8. 统一认证服务CAS 5安装
  9. 【Maven3教程】Maven多工程、多模块
  10. 3.Utm详细实现-用户生命流程