C/C++语言中的字符类型

存在两种表示字符的基本类型:

char:一个字节8bit表示,最多表示256个字符,表示和用来处理ASCII字符集,国际通用

wchar_t:多字节字符表示,典型2个字节或者4个字节,如GNU libc中为4B,可以表示更多的字符,满足国际化应用开发的需求,实现标准

在开发中ASCII编码字符都是用char来表示,可以转换成wchar_t表示;wchar_t类型与Unicode编码是完全独立的概念,不过在实现上Unicode编码一般用wchar_t来表示实现而已,但wchar_t字符并不一定就是Unicode编码字符。

对应两种字符类型存在两种字符串类型(C++):

string: char字符列表或者是字节列表(bytes)

wstring: wchar_t字符列表或者是宽子节列表

对应两种字符类型的输出函数流对象有:

sprintf/wsprintf: 分别对应char与wchar_t

cout/wcout:分别对应string与wstring

stringstream/wstringstream: 分别对应string与wstring

字符串常量

C++11标准中增加了一些表示字符串常量的标识,如下有:

L"您好!": wstring字符串常量,使用文件保存编码方式字符集

R"(您 好 \n)": 原始字符串常量(字节数组),保留所有的字符

u8"您好!": string字符串常量(字节数组),使用UTF8进行编码保存

字符集及编码

已知有很多的字符集,比如:ASCII,UTF8,GBK,GB2312,UTF16,UTF32,UNICODE,Latin等等。常用中文字符集编码有:

UTF8:又分为带签名和不带签名两种,Windows代码页为65001,VS中应该选择【UTF8-带签名】的格式

GBK/GB2312:Windows代码页为936

GB18030: Windows代码页为54936

小技巧:修改Windows系统中cmd命令行窗口的显示字符集,默认字符集为OS字符集,如GBK-936。如果希望显示UTF8字符,则可以修改:chcp 65001.

在VS项目的调试命令窗口中无法手动修改,可以通过system函数来修改:

system("C:\\Windows\\system32\\chcp 65001");// 修改终端字符集为UTF8

源文件的编码保存选项

可以将源文件保存成不同的编码方式,如果文件中有中文,则必须选择可以对中文进行编码的字符集,如UTF8,GBK,GB2312等,否认可能会出现莫名其妙的编译错误,因为文件中存在无法识别的字符内容。

在Visual Studio中,选中文件后该设置在:【文件 - 高级保存选项】中。

C++11中GBK/UTF/wchar_t之间的编码处理转换

在处理中文时,不同的应用场景下总是无法避免进行GBK和UTF8之间的相互转换,C++11标识提供了和机制和工具来简化处理。

借助其中的std::wstring_convert和std::codecvt_utf8模板,通过wchar_t类型为中介,可以快速地实现转换,基本代码如下:

/*

转换GBK编码的中文到UTF8编码:GBK - WChar - UTF8两次转换

*/

//GBK在linux下的locale名可能是"zh_CN.GBK"

const char* GBK_LOCALE_NAME = ".936"; //GBK在windows下的locale name

std::wstring_convert<:codecvt_byname char mbstate_t>> Conver_GBK(new codecvt_byname(GBK_LOCALE_NAME)); //GBK - wchar_t

std::wstring _wname = Conver_GBK.from_bytes(data.Name); // 输入为char*的字符串表示或者数组,输出为wstring

std::wstring _waddr = Conver_GBK.from_bytes(data.Address);// 输入为char*的字符串表示或者数组,输出为wstring

std::wstring _wdept = Conver_GBK.from_bytes(data.GrantDept);// 输入为char*的字符串表示或者数组,输出为wstring

wcout << "Name: " << _wname << ",addr:" << _waddr << ",dept:" << _wdept << endl;

// 将wstring转化为UTF8编码的字节数组string表示

std::wstring_convert<:codecvt_utf8>> conv;

string _name = conv.to_bytes(_wname);// 输入为wstring字符串

string _addr = conv.to_bytes(_waddr);

string _dept = conv.to_bytes(_wdept);

// 将UTF8字符串转换为GBK字符编码表示string字节数组

std::string _name = Conver_GBK.to_bytes(conv.from_bytes(_name)); // 先转换成wstring,然后再转换成GBK的string

std::string _addr = Conver_GBK.to_bytes(conv.from_bytes(_addr)); // 先转换成wstring,然后再转换成GBK的string

matlab wchar_t,C++中wchar_t与wstring理解及中文编码的处理相关推荐

  1. [转]wchar_t char std::string std::wstring CString 转换

    [转]wchar_t char std::string std::wstring CString 转换 1 #include <string> 2 // 使用CString必须使用MFC, ...

  2. MATLAB中的函数句柄 理解

    MATLAB中的函数句柄 理解 https://zhuanlan.zhihu.com/p/266263265 https://blog.csdn.net/kevinhg/article/details ...

  3. matlab怎么画碎石图,成分分析中biplot函数不理解_主成分分析

    成分分析中biplot函数不理解_主成分分析 对主成分分析中的biplot函数不理解,谁能帮忙解释?谢谢了 解答: 运行下面的例子,理解我加黑的那句话即可: Examples Perform a pr ...

  4. c语言 wchar_t,一个【wchar_t】引发的学案

    里面讲到了wchar_t -------------------------------------------------------------- Win OS 之 wchar_t 与 ANSI/ ...

  5. 花了1晚上diy的matlab解数独算法,很好理解!

    花了1晚上diy的matlab解数独算法,很好理解! 前言 一.数独的规则 二.算法 1.思路 2.流程图 3.Matlab代码 总结 前言 老婆最近迷上了数独,还给我拍了张照片,初步了解了规则之后, ...

  6. matlab差分阶跃响应,matlab在DSP中的应用(四)---离散系统的冲激响应和阶跃响应...

    一.实验目的 (1)加深对离散线性移不变(LSI)系统基本理论的理解,明确差分方程与系统函数之间的关系. (2)初步了解用MATLAB语言进行离散时间系统研究的基本方法. (3)掌握求解离散时间系统冲 ...

  7. matlab换挡程序,一种基于MATLAB换挡过程中快速锁定分析数据的方法与流程

    本发明涉及汽车变速器数据分析,特别的,涉及一种基于matlab换挡过程中快速锁定分析数据的方法. 背景技术: 自动变速器的核心功能是能根据驾驶员意图进行自动换挡,解放驾驶员的左脚:在自动变速器的使用过 ...

  8. matlab在电磁波中的应用,Matlab在电磁场与电磁波学习中的应用

    Matlab在电磁场与电磁波学习中的应用 裴逸菲 (燕京理工学院信息科学与技术学院,河北廊坊 065201) 摘要:针对电磁场与电磁波在大学课程中的理论性强.概念抽象的特点,在学习中引入matlab软 ...

  9. matlab在天线方向图中的应用与研究,MATLAB在天线方向图中的应用与研究

    MATLAB在天线方向图中的应用与研究 王曼珠1,张民1,崔红跃2 (1.北京电子科技学院 通信工程系,北京100070;2.中国民用航空大学,天津300300)a 摘 要:以天线方向图函数为例,分析 ...

最新文章

  1. 【每日一算法】唯一摩尔斯密码词
  2. wince中的hook(钩子)用法
  3. 用户 'sa' 登录失败。原因: 未与信任 SQL Server 连接相关联。
  4. JavaSE(十五)——注解
  5. Springboot配置通过URL访问图片(静态资源)
  6. 机器学习各算法思想(极简版)
  7. 数据预处理之归一化/标准化/正则化/零均值化
  8. java 圆形碰撞箱_你会使用“碰撞箱”吗?5种你不知道的玩法 甚至能定位死亡方位...
  9. 手写java_手写java锁
  10. python实验指导书答案函数代码复用_#Python学习笔记(5)函数和代码重用,复用
  11. 本科计算机相关课程设计,计算机科学及技术专业本科生大学课程设计.doc
  12. ansys linux 安装教程pdf,Deepin linux安装Ansys13详细教程.pdf
  13. node 生成随机头像_给微信设置卡通头像,再不怕撞脸!
  14. w8服务器dns修改,怎么修改DNS Win8修改DNS服务器地址的具体步骤图解
  15. 学习虚幻4(一)U3D与UE4的比较
  16. L'Hospital法则
  17. AI 去掉图片的背景色
  18. (附源码)基于PHP下的大学生校园交流论坛的设计与实现 毕业设计101634
  19. Vue父传子详细教程
  20. 【STM32项目】老人健康跌倒检测系统实现

热门文章

  1. Excel表格的创建与制作
  2. Blender教程利用Cell Fracture插件制作破碎效果
  3. 个人所得税计算python_Python基础
  4. Debian11安装Python3.10
  5. unity 拖拽UI
  6. 目标管理的SMART目标
  7. 榆林市1985-2000土地利用变化的生态环境效应分析
  8. ctfshow RCE极限挑战 wp
  9. 六角填数c语言程序,蓝桥杯历届-六角填数
  10. 中国杯即将拉开大幕!国足喜迎利好消息:首场执法裁判不是外人!