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的转换,保存,与还原。
转载于:https://www.cnblogs.com/claruarius/p/kuanzifu.html
C++ 宽字符(wchar_t)与窄字符(char)的转换相关推荐
- 宽字符wchar_t和窄字符char区别和相互转换
转自:http://blog.csdn.net/nodeathphoenix/article/details/7416725 1. 首先,说下窄字符char了,大家都很清楚,就是8bit表示的b ...
- C++ 宽字符 窄字符 char wchar
目录 wchar_t和char区别 宽字符 string和wstring的区别 wchar_t和char区别 参考链接 宽窄字符是与一个字符所占的字节数有关,如果一个字符只占一个字节,那么它就是窄字符 ...
- Windows核心思想-宽字符与窄字符(Unicode和ASCII)
目录 基本概念 演示 基本概念 宽字符:Unicode字符,双字节 窄字符:ASCII字符,单字节 Windows中所有的底层函数都是Unicode编码 COM组件必须使用Unicode编码(COM组 ...
- C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符
C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...
- C++ 宽、窄字符转换
目录 locale setlocale函数 设置字符编码 单字符宽字符互相转换 mbstowcs函数 wcstombs函数 mbtowc函数 wctomb函数 宽.窄字符转换总结 查看本文前先弄清字符 ...
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...
- wchar 格式控制符_控制台输出宽字符wchar_t的中文显示问题
在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行).对于wcout,需要将其locale设为本地语言才能输出中文: wcout输出时显示不了中文, ...
- C语言指针-字符指针整型指针char*s int*a
案例代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {//字符指针cha ...
- java编程规范每行代码窄字符,wiki/0xFE_编程规范.md at master · islibra/wiki · GitHub
0xFE_编程规范 使用UTF-8编码 使用空格缩进 命名 清晰表达意图, 少用缩写(行业通用除外, 如: request=req, response=resp, message=msg), 不应使用 ...
最新文章
- 如何知道react对象的值_基于react怎么获取兄弟元素的对象或它的值?
- 15. 三数之和(双指针)
- bootstrap 表格不用tr td如何写_Pandas还能用来写爬虫?
- java二次开发浏览器内核_深入理解基于Selenium的二次开发
- Javascript判断object还是list/array的类型(包含javascript的数据类型研究)
- 官方再曝vivo X30系列拍照新技能:主角光环不虚焦
- Oracle默认的用户名和密码
- Linux下vim常用操作
- R语言快速深度学习进行回归预测(转)
- 【java】彩票中奖码生成器:java.util.Random里的方法public int nextInt(int bound)
- 线性混合模型及R实现
- mysql 5.6 cmake 参数_编译cmake MySQL 5.6.10报错
- 设计-前端设计尺寸与规范
- web前端网页设计期末课程大作业:中华传统文化题材网页源码——基于HTML实现中国水墨风书画艺术网站(12个页面)
- 2020十大高薪岗位出炉,程序员霸榜
- kali获取同局域网设备的图片信息
- Hackthebox(1)系列持续更新
- iTRON新闻大集合
- 无法启动此程序因为计算机丢失zlib.dll,zlib1.dll怎么修复?zlib1.dll丢失解决方法及注意事项...
- 揭秘广告软文的五种写法