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的转换,保存,与还原。
C++ 宽字符(wchar_t)与窄字符(char)的转换的更多相关文章
- 宽字符wchar_t和窄字符char——putwchar、wprintf
宽字符wchar_t 与 窄字符char 先说下窄字符char,这个大部分读者应该很清楚,char类型的变量占一个字节(byte)(也就是8个bit(比特)),能表示256个字符,那char的范围有两 ...
- 宽字符wchar_t和窄字符char区别和相互转换
转自:http://blog.csdn.net/nodeathphoenix/article/details/7416725 1. 首先,说下窄字符char了,大家都很清楚,就是8bit表示的b ...
- GBK转utf-8,宽字符转窄字符
//GBK转UTF8 string CAppString::GBKToUTF8(const string & strGBK) { string strOutUTF8 = "" ...
- C语言小程序——推箱子(窄字符和宽字符)
C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
1.volatile: 要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. 当设置了成按照C99标准运行之后,使用volatile变量之后的程序运行的时间将比register的 ...
- 使用Unicode(宽字节字符集);多字节字符集中定义宽字节变量
2012-03-25 14:54 (分类:计算机程序) 2.2 宽字符和C 宽字符不一定是Unicode.Unicode是宽字符集的一种.然而,因为本书的焦点是Windows而不是C执行的理论,所以书 ...
- 计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]
有一道经典的面试题: 统计 welcome to china中每个字符出现的次数,不考虑大小写. 第一个出现在脑海里的想法是: 1. 将字字符串转换成 char数组: 2. 用 for循环遍 ...
- wchar_t 和 char 之间转换
vc++2005以后,Visual studio 编译器默认的字符集为Unicode.VC中很多字符处理默认为宽字符wchar_t,如CString的getBuffer(),而一些具体操作函数的输入却 ...
- 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式
Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...
随机推荐
- JAVA的StringBuffer类
StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...
- 解决mac的日历问题:服务器响应一个错误
出了一个问题好久,平时也不用这个同步不靠谱的日历.今晚花点时间解决了下. 参考Apple 官网日历的问题解答. 当出现如下情况时: 退出日历和提醒事项. 从 Apple () 菜单中选取“系统偏好设 ...
- slf4j-simple的配置
slf4j-simple是一款日志框架 它既可通过VM arguments来配置也可通过在classpath放置simplelogger.properties文件来配置 通过VM arguments来 ...
- 转:打造DropDownList,TreeView,ListBox无限极分类目录树
[csharp] view plaincopyprint? #region DropDownList无限递归显示层次关系 /// <summary> /// 创建无限分级下拉列表框 /// ...
- MYSQL基础笔记(一)
关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...
- Python 字典排序
思路是把字典转为列表后再排序 d={'z':1,'y':2,'x':3} # 字典 s=d.items() # [('y', 2), ('x', 3), ('z', 1)] 列表 s.sort() # ...
- python(1) - 安装篇
本次主要在windows下安装pyton2 和python3,实现 在cmd中输入 ptynon进入python2 在cmd中输入python3进入python3 第一步 当然是要下载python安装 ...
- 写入文件txt
FileStream fs = new FileStream(@"d:\service.txt", FileMode.OpenOrCreate, FileAccess.Write) ...
- CentOS(二)--初识linux的一些常用命令
linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.磁盘驱动器.键盘.鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命 ...
- ORA-01790 错误处理
今天在练手的时候出现了一个ORA-01790 的错误,决定把他写下来保留起来. 先来创建两张测试用的简单的表. SQL> create table test01 (id number(3),na ...