一、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=>string
std::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 => wstring
std::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

c++中wstring 和 string的转换相关推荐

  1. cocos2d-x开发中wstring和string的转换

    cocos2d-x开发中汉字操作技术是必须要面对的,其中可能要用到wstring和string的相互转换.我在网络上搜索到的能够应用于android 和WIN32(其他的平台没有试)环境下的汉字的可选 ...

  2. [转载] python中list与string的转换

    参考链接: Python 字符串string中的isupper,islower,lower,upper 1.list转string 命令:''.join(list) 其中,引号中是字符之间的分割符,如 ...

  3. [导入]c#中的关于string的转换的问题

    在C#中,我们可以使用范型方法,当返回值为string的时候有点问题: 的一个范型方法实现带默认值的类型转换     public static T ConvertTo<T>(object ...

  4. Javascript中JSON与String相与转换

    JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; //注意有 ...

  5. JS中int和string的转换

    1.int型转换成string型 (1) var x=100 a = x.toString() (2) var x=100; a = x +""; //JS会自动隐性转换 2.将s ...

  6. Java中bytebuffer和string的转换记录

    原文地址:https://stackoverflow.com/questions/17354891/java-bytebuffer-to-string byte[] bytes = k.getByte ...

  7. 数据类型转换:wstring和string

    wstring和string互相转换 摘自大佬 string转wstring #include<iostream> #include<locale> #include<v ...

  8. c++中几种常见的类型转换。int与string的转换,float与string的转换以及string和long类型之间的相互转换。to_string函数的实现和应用。...

    1.string转换为int a.采用标准库中atoi函数,对于float和龙类型也都有相应的标准库函数,比如浮点型atof(),long型atol(). 他的主要功能是将一个字符串转化为一个数字,在 ...

  9. C#中char[]与string之间的转换

    C#中char[]与string之间的转换 原文:C#中char[]与string之间的转换 string 转换成 Char[] string ss = "abcdefg"; ch ...

最新文章

  1. 入职阿里啦!极客时间kotlin
  2. rac 火星舱如何备份oracle_Oracle数据库(RAC)巡检报告
  3. 极详细的ECC讲解 -OOB与ECC
  4. 前端学习(1906)vue之电商管理系统电商系统之渲染修改用户的表单
  5. LeetCode算法入门- Reverse Integer-day6
  6. 基于FPGA实现DDS正弦波发生器
  7. Failed to load selinux policy, Freezing | CentOS | Redhat | RHEL
  8. 5脚12v继电器接线图解_继电器线圈并联二极管的作用
  9. 裴礼文数学分析中的典型问题与方法第5章级数练习
  10. 聚焦 ECharts
  11. xp无法访问win7计算机,xp连接win7共享打印机无法连接
  12. 20145325张梓靖 《信息安全系统设计基础》课程总结
  13. 鹅厂、狗厂、猫厂、熊厂、鸟厂、粮厂
  14. 疯狂打CALL,机器人抢镜时尚大典
  15. php 获取用户是否关注微信公众号
  16. 应聘Java笔试时可能出现问题库及其答案(最全版)
  17. [问题已处理]-helm提示kubernetes configuration file is group-readable
  18. 爱码物联 二维码营销Saas平台_为中小微企业而生
  19. 【iOS】程序内跳转到支付宝转账(非SDK实现支付)及相关监听
  20. 【C语言】指针题及解析

热门文章

  1. Vue extend 学习
  2. C# 禁止修改已装箱了的值类型的字段值,但是可以通过接口的方式实现
  3. 从XMLHttpRequest中获取请求的URL
  4. OneNote 2013 快捷键
  5. 【转】博客园中应用LaTex进行公式编写
  6. 如何修复XML内存“泄漏”
  7. 嵌入式根文件系统的移植和制作详解
  8. 推荐:CLR 完全介绍-一篇讲解CLR内存回收机制以及常见的调试技巧的文章
  9. java8新特性(2)--接口的默认方法
  10. 思维-CF-739A