中文在C/C++中的处理和汉字乱码问题(wchar_t)
中文字在C/C++中的处理
现在编程的语言和编程环境随着中国的发展開始对中文有进一步的支持。可是对中文的支持整体来说是有缺陷的,并且有与编译环境的不同导致中文在当前的C/C++中有非常多问题,并且非常多版本号对中文的支持是不全然的。就拿DEV-C++和VS2005为例。对与MSDN的帮助和网上的讲述两者在那些代码的支持有非常多不同的地方。
而我要讨论的就是对于中文在C/C++的应用方法。
首先中文字是在一般char的范围以外的,所以我们不能用单个char存储我们的中文字,于是我们大多引进wchar_t这种宽字符的数据类型。可是在我所用过的编译环境中通常是定义为wchar_t。这是C++语言中认可的定义。他的空间就和unsigned short的大小一样,所以有这种内部定义:typedef
unsigned short wchar_t位的。
在DEV-C++中我们有非常多方法是不能用的,对于VS2005,我们能够定义和应用的非常多方法和和非常多库函数在DEV-C++都不能够用的。如在MSDN和非常多网络资料中提到的输入和输出方法像wcin和wout在DEV-C++都是显示没有定义的,也就是说DEV-C++是不支持这些方法的。简单宽字符的输入和输出例如以下:
#include<iostream>
using namespace std;
int main()
{
wchar_t a[3];
wcin >> a;
wcout << a << endl;
return 0;
}
但这样仅仅能输入单个汉字字符,假设超过2个中文字就会有溢出的错误,而用这个方案,尽管我们用了wchar但全然没有突出我们的目的,它仍然是一个中文字占两个wchar_t单位。并且我们也没有办法对里面的汉字字符进行操作所以这是不可行的,但这是C的使用方法。在C++中wchar则对其进行了改动,使得中文的支持更加好了。
在C++中,wchar_t是语言内建的数据类型。wchar_t的长度是由实现决定的。
如今我们正式開始讨论中文在我们的C++中的支持和应用的问题。
C++是一种非常好的语言,它为了适合不同的地域语言的开发,它增加了一个叫做locale包的头文件。里面定义了不同语言和语言的缩写。这是我们使用wchar_t进行中文的个方面的操作的一个重要的环节。对于我们的输入输出有非常重要的影响。
首先我们的应用事例是这种:
#include <iostream>
#include <locale>
using namespace std;
int main()
{
locale loc( "Chinese-simplified" );
wcin.imbue(loc);
wcout.imbue( loc );
//上面三行代码和setlocale(LC_ALL,"chs");作用是一样的。
wchar_t c[4];
wcin >> c;
wcout << c <<endl;
return 0;
}
在这里我门用到了#include <locale> 用来包括这个头文件,然后生成一个locale的对象。里面的參数是仅仅採用中文,接着我们对我们的输入和输出进行imbue的设置。是用来Changes
the locale的作用。于是我们输入和输出就会变成我们所须要的以中文字的为单位的存储过程。上例中的c[4] 则能够输入3个中文字,最后一个是’\0’,这样就初步达到了我们所要求的效果。同一时候我们就能够取出我们要的每一个定位的中文字符,进行和char相同的数据处理。
中文在C/C++中的处理和汉字乱码问题(wchar_t)的更多相关文章
- mysql在cmd中查询到的汉字乱码问题解决 方法一
只要执行如上两个 set character_set_connection = gbk; set character_set_results= gbk; 将编码格式转换成gbk即可
- 解决php中echo出来的汉子乱码
问的人太多了,就列出来展示给大家! 需要了解的概念: Content-Type:用于定义用户的浏览器或相关设备如何显示将要加载的数据,或者如何处理将要加载的数据 MIME:MIME类型就是设定某种扩展 ...
- 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK
一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位 ...
- DecimalFormat 中的 # 与 0 的区别(中文帮助文档中翻译可能是错误的)
想对数字进行格式化的时候,可能会使用到 java.text.DecimalFormat 类.中文帮助文档中,有如下符号 位置 本地化 含义 0 数字 是 阿拉伯数字 # 数字 是 阿拉伯数字,如果不存 ...
- 将url传参的中文字符在页面中显示正常
//将url传参的中文字符在页面中显示正常var url=decodeURI(url);
- PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分)
PTA数据结构与算法题目集(中文) 7-36 社交网络图中结点的“重要性”计算 (30 分) 7-36 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某 ...
- 记录一下Vray5中文汉化版本中导出EXR或vrimg多通道文件的那些坑和解决方法
最近在给一个培训机构代课,学生英语基础差,就安装了Vray5的中文版,噩梦从此开始. 做过合成的都知道,需要输出多通道到NUKE或者AE中进行合成,通常情况下把多个pass分成不同的文件对硬盘反复读写 ...
- PHP实现中文字串截取无乱码的方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
- SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)
注:本文为个人转存,原文地址:http://blog.csdn.net/qiuyu8888/article/details/8021410 问题:SQL版在使用过程中有时会出现乱码,我的症状是中文字符 ...
随机推荐
- Python之双色球选购和三级菜单问题
1:双色球选购# 1 双色球(假设一共八个球,6个红球,球号1-32.2个蓝球,球号1-16)# 2 确保用户不能重复选择,不能超出范围# 3 用户输入有误时有相应的错误提示# 4 最后展示用户选择的 ...
- redis学习-sds数据类型
今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 <Redis 设计与实现(第一版)> 于是决定从这个开始入门. 1.数据类型定义 typedef ...
- R语言常用数学函数
语言的数学运算和一些简单的函数整理如下: 向量可以进行那些常规的算术运算,不同长度的向量可以相加,这种情况下最短的向量将被循环使用. > x <- 1:4 > a <- 1 ...
- bootstrap插件bootbox参数和自定义弹出框宽度设置
插件官方地址:http://bootboxjs.com/ alert: 1 bootbox.alert("Hello world!", function() {}); dialog ...
- C# 创建与读写配置文件
配置文件内容为 <?xml version="1.0" encoding="utf-8" ?> <configuration> < ...
- 构造From窗体获取数据库数据,去除数据库中无用信息,并赋值给字段,最后画出图
private void cbNum_SelectedIndexChanged(object sender, EventArgs e) { FieldListLug.Clear();//继续清除字段 ...
- 【转载】jxl的使用总结(java操作excel)
jxl.jar是通过java操作excel表格的工具类库: 链接:https://pan.baidu.com/s/1AAT_eA_Q47zFeQohap6eQg 提取码:777b 1:通过模拟实现创建 ...
- 在做导入一个excel文件的时候,数据有空值的时候
StringUtil.isNotEmpty(i.getFname()),用这个方法可以解决 java string 去除前后两端的空格和空字符使用.trim()
- 并查集(Union Find)的基本实现
概念 并查集是一种树形的数据结构,用来处理一些不交集的合并及查询问题.主要有两个操作: find:确定元素属于哪一个子集. union:将两个子集合并成同一个集合. 所以并查集能够解决网络中节点的连通 ...
- 扒一扒PROMISE的原理,大家不要怕!
在前端的日常工作中,回调函数(callback)应该是见怪不怪了,但是当回调函数遇上了异步(async),这就令人发指了.那么异步是什么意思呢,简单地说就是不等你执行完,就先执行下方的代码了. 举个