中文在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版在使用过程中有时会出现乱码,我的症状是中文字符 ...
随机推荐
- EasyUI tree 异步树与采用扁平化实现的同步树
所谓好记性不如烂笔头,为了以防忘记,才写下这篇博客,废话不多.. 异步树: tips: 可以采用easyui里的原始数据格式,也可以采用扁平化的数据格式. 使用场景: 当菜单模块数量庞大或者无限极 ...
- hihocoder1365 图片排版
思路: 模拟,枚举,dp. 参考了https://github.com/buptlxb/hihoCoder/blob/master/solutions/1365/picture_arrange.cpp ...
- Android 简单的语音播报
不解释快上车 Main.class package com.example.myapp; import android.app.AlertDialog;import android.os.Bundle ...
- microPython 的逗比报错的问题
今天搞了一天,发现了各种问题,首先最终的解决办法就是重现刷固件!!!! 重刷固件就需要清除flash! cd C:\Users\sansong\AppData\Local\Programs\Pytho ...
- viewpager滑动时页面不能刷新
有一种解决方法就是覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过ge ...
- Android yuv转Bitmap
YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=nu ...
- Git——github高级
分支管理 分支不是越多越好,只求一个稳定的分支,即master不要轻易去更改 对应master要有一个开发者分支,保证mater分支的稳定性 所有的功能都在开发者分支上进行 在所有功能开发后新建发布分 ...
- Farseer.net轻量级开源框架 中级篇:数据库切换
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 动态数据库访问 下一篇:Farseer.net轻量级开源框架 中级篇: SQL执行 ...
- vim之vimrc配置文件
""""""""""""""""&quo ...
- 构造From窗体获取数据库数据,去除数据库中无用信息,并赋值给字段,最后画出图
private void cbNum_SelectedIndexChanged(object sender, EventArgs e) { FieldListLug.Clear();//继续清除字段 ...