了解

长度

宽字符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)的转换的更多相关文章

  1. 宽字符wchar_t和窄字符char——putwchar、wprintf

    宽字符wchar_t 与 窄字符char 先说下窄字符char,这个大部分读者应该很清楚,char类型的变量占一个字节(byte)(也就是8个bit(比特)),能表示256个字符,那char的范围有两 ...

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

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

  3. GBK转utf-8,宽字符转窄字符

    //GBK转UTF8 string CAppString::GBKToUTF8(const string & strGBK) { string strOutUTF8 = "" ...

  4. C语言小程序——推箱子(窄字符和宽字符)

    C语言小程序——推箱子(窄字符Version) 推箱子.c #include <stdio.h> #include <conio.h> #include <stdlib. ...

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

    1.volatile: 要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. 当设置了成按照C99标准运行之后,使用volatile变量之后的程序运行的时间将比register的 ...

  6. 使用Unicode(宽字节字符集);多字节字符集中定义宽字节变量

    2012-03-25 14:54 (分类:计算机程序) 2.2 宽字符和C 宽字符不一定是Unicode.Unicode是宽字符集的一种.然而,因为本书的焦点是Windows而不是C执行的理论,所以书 ...

  7. 计算字符串中每种字符出现的次数[Dictionary<char,int>泛型集合用法]

    有一道经典的面试题: 统计 welcome to china中每个字符出现的次数,不考虑大小写.      第一个出现在脑海里的想法是: 1. 将字字符串转换成 char数组: 2. 用 for循环遍 ...

  8. wchar_t 和 char 之间转换

    vc++2005以后,Visual studio 编译器默认的字符集为Unicode.VC中很多字符处理默认为宽字符wchar_t,如CString的getBuffer(),而一些具体操作函数的输入却 ...

  9. 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

    Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...

随机推荐

  1. 返回ListBox选中的多项目

    //返回ListBox选中的多项目 procedure TForm1.Button2Click(Sender: TObject);vari:Integer;s:string;begin   for i ...

  2. JavaScript与Flash的通信

    当Flash置于HTML容器中时,经常会遇到AS与JS的通信问题,例如:JS能否调用AS中的变量.方法,AS能否调用JS中的变量.方法等等.答案是肯定的.随着技术的不断发展,解决方案也是多种多样的. ...

  3. mac 功能修改。。。。

    个人表示 Mac 下的 Spotlight 搜索功能确实是个鸡肋,安装 QuickSilver 才是王道!所以我个人就把 Spotlight 关闭掉了.方法很简单,还是要用到 “终端” 工具. 在 “ ...

  4. oc-05-对象的创建

    // 11-[掌握]创建一个对象并访问成员变量 #import <Foundation/Foundation.h> //声明 @interface Person : NSObject//类 ...

  5. String StringBuilder以及StringBuffer

    例一:[看了威哥视频,下面更好理解] package sunjava; public class String_test { public static void main(String[] args ...

  6. 支持https请求以及https请求的抓包

    iOS9推出的时候,苹果希望大家使用https协议,来提高数据传输之间的安全性.下面我就从最简单的代码介绍,如何在工程中设置,来支持https的请求. 一.证书准备篇 1.证书转换 在服务器人员,给你 ...

  7. Asp.Net 之 服务器端控件与客户端控件的区别

    服务器控件,即Asp.Net的控件,控制这些控件必须经过服务器处理,然后响应用户,代码在服务器端解释执行,生成根据用户的浏览器而定的html元素. 客户端控件,即普通Html控件,使用script控制 ...

  8. MySQL 更改默认编码为 utf8 (转)

      转自blog.sina.com.cn/s/blog_4c451e0e0100vefm.html 1.打开MySQL安装目录找到 my.ini,如:C:\Program Files\MySQL\My ...

  9. win10 IIS10 HTTP 错误 404.2 - Not Found

    环境win10系统IIS10里边发布web应用程序的时候,出现 HTTP 错误 404.2 - Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页 ...

  10. LeetCode 152

    Maximum Product Subarray Find the contiguous subarray within an array (containing at least one numbe ...