博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++中wstring 和 string的转换
阅读量:4650 次
发布时间:2019-06-09

本文共 2925 字,大约阅读时间需要 9 分钟。

一、wchar_t和char的基础知识

1.C程序中使用的char类型,是占用一个字节,一共可以表示256个字符。而在32位系统中,char*是占用四个字节的,因为一个指针变量占用的存储空间为4个字节。char类型的编码规则一般为ASCII编码。我在此处测试了一下再GCC中char[]是不可以存储中文字符的(可能是我的编译器没有和编辑器的编码方式不一样,导致出来的结果是乱码的中文),但是在vs中,似乎使用某些优化,char是可以用来存储中文字符的。但是他们都是显示出文字来的,ASCII编码中没有汉字,但是还是显示出来了,这本身存在一些我们不知道的操作(这个内容需要自己来深究)。

在尝试了修改了编码问题后,GCC编译器也可以实现中文的输入了。(待续)

此时,对于这个问题我已经找到了我的答案

普通的char类型是一个正数,是从0-127个编码,而输入中文的字符的值第一个字节都是负数(很难受,好像还是不对),可能是通过数字的符号来判定改符号是一个字节还是两个字节的。因此判定char的编码规则应该不只是Ascii一种。

 

2.wchar_t在C程序中占用的字节为2个字节,相当于一个无符号短整型。其长度是可变的,根据运行的平台而定,可以是2个字节或者是4个字节。在win32 MSVC环境下,C库中wchar_t的长度为2个字节

typedefine unsigned short wchar_t;/* 16bits*/

wchar_t采用的是unicode编码,unicode的编码是固定的,但是因为其需要2到4个字节,它的存储方法不尽相同。所以会产生不同版本的unicode。

unicode 的一种实现方式 UTF-8。

参见链接https://www.cnblogs.com/kingstarspe/p/ASCII.html

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

(未完待续)

wchar_t*与char*的转换

经过了上面的逻辑讨论之后我们可以发现,其实char和wchar_t的转换过程就是一个编码转化的过程,需要大量的判断语句来实现,其原理大概也就是根据字节的信号来判断字符需要的字节数。下面仅提高用于编程的模板。

这是在window下的方法,需要添加<windows.h>头文件

//将单字节char*转化为宽字节wchar_t*  wchar_t* AnsiToUnicode( const char* szStr )  {      int nLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0 );      if (nLen == 0)      {          return NULL;      }      wchar_t* pResult = new wchar_t[nLen];      MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen );      return pResult;  }    //将宽字节wchar_t*转化为单字节char*  char* UnicodeToAnsi( const wchar_t* szStr )  {      int nLen = WideCharToMultiByte( CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL );      if (nLen == 0)      {          return NULL;      }      char* pResult = new char[nLen];      WideCharToMultiByte( CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL );      return pResult;  }

 下面这段代码实现的是string和wstring的转换,可能在实际中运用的比较多,(只有在C++中才有string类型哦,纯C中只能使用char*或者是char []),稍作修改之后就可以成为char*和wchar_t直接的转换函数了。该函数用到的头文件是C中的<string>文件。

//wstring=>stringstd::string WString2String(const std::wstring& ws){    std::string strLocale = setlocale(LC_ALL, "");    const wchar_t* wchSrc = ws.c_str();    size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;    char *chDest = new char[nDestSize];    memset(chDest, 0, nDestSize);    wcstombs(chDest, wchSrc, nDestSize);    std::string strResult = chDest;    delete[]chDest;    setlocale(LC_ALL, strLocale.c_str());    return strResult;}// string => wstringstd::wstring String2WString(const std::string& s){    std::string strLocale = setlocale(LC_ALL, "");    const char* chSrc = s.c_str();    size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;    wchar_t* wchDest = new wchar_t[nDestSize];    wmemset(wchDest, 0, nDestSize);    mbstowcs(wchDest, chSrc, nDestSize);    std::wstring wstrResult = wchDest;    delete[]wchDest;    setlocale(LC_ALL, strLocale.c_str());    return wstrResult;}

(以后不遇见问题,可能就不会再深究了,再见了)

转载于:https://www.cnblogs.com/bookdrip/p/9987099.html

你可能感兴趣的文章
noi.ac NOIP2018 全国热身赛 第四场 T1 tree
查看>>
(转)linux下vi编辑器编写C语言的配置
查看>>
多线程基础知识 转
查看>>
MyBatis generator 使用方式 小结
查看>>
Android小项目之五 splash动画效果
查看>>
JavaScript 第十章总结:first class functions
查看>>
微信公众号发送客服消息【文本、图片】
查看>>
iText简介(转)
查看>>
vue搭建后可以改下全局配置
查看>>
【Docker】Segmentation Fault or Critical Error encountered. Dumping core and abort
查看>>
字典树从第i个构造HDU2846
查看>>
SQL优化笔记(二)—CPU优化
查看>>
bzoj 1042 HAOI2008 硬币购物
查看>>
JS 心得总结
查看>>
WINDOWS 下安装boost
查看>>
Log4j(1)--hellloworld
查看>>
java中equals和 == 的区别
查看>>
greenDao 3.0基础
查看>>
CSS自学笔记(15):CSS3多列布局
查看>>
Objective-C ,ios,iphone开发基础:ios数据库(The SQLite Database),使用终端进行简单的数据库操作...
查看>>