C++ wchar_t 的中文输出问题
2012-02-19 15:42
405 查看
C++ wchar_t 的中文输出问题
1.char和wchar_t
众所周知,在C++中,包括char和wchar_t这两种内置类型,主要用来表示单一的字符。其中char类型一般占用一个字节,而wchar_t类型从字面上理解,可以看出它表示宽字符,也就是其占用空间要比char类型更大。当然,内置类型的长度在C++标准中有着最小值的规定,但具体在某台机器上或者某个程序中占用的空间则取决于三个因素:1.编译器字长
2.操作系统字长
3.机器字长(cpu字长)
因此,不能对于不同环境中的内置类型字长一概而论,具体长度可以调用函数sizeof()获取。例如在32位微机上,使用ubuntu32位系统和GNU编译器,下列两个表式正确:
sizeof(char) == 1 sizeof(wchar_t) == 4
在C++中同时存在char和wchar_t,很明显是为了解决英语以外的其他语言的字符处理问题。因为1字节包含8比特,即其只能表示2^8=256个不同的值,这对于英语这样的只需26个字母就可以完全表示的语言来说是够用的,但对于汉语,日语等字符集较为庞大的语言就不适用了。而使用wchar_t可以表示2^32个不同值,显然更加合适。
2.wchar_t的中文显示问题
既然wchar_t是用来解决中文等文字的字符处理问题,而最基本的字符处理问题就是IO问题,因此可以从IO问题入手初窥wchar_t对于中文字符的处理过程来获得一个大概的印象。我们使用wcin读取窗口中的中文字符输入,之后在标准宽字符输出中打印。#include <iostream> #include <locale> //using namespace std; //this main function deals with wide character and Chinese character int main(int argc, char **argv) { std::ios_base::sync_with_stdio(false); //garantee that iostreams are not synchronized with stdin or stdout std::locale loc("zh_CN.utf8"); //set the character set to zh_CN.utf8 std::wcin.imbue(loc); //set the locale of wcin and wcout std::wcout.imbue(loc); wchar_t c; std::wcin >> c; //read the input std::wcout << c << std::endl; //output return 0; }
在这段程序中需要注意:
1.必须使用wcin和wcout对宽字符进行输入和输出,wcin和wcout是cin和cout的宽字符版本,也属于标准库的一部分。
2.main函数首句是标准库中ios_base类的方法,将iostream与C语言中的stdin/stdout的同步关系取消,否则wcout不能正常输出中文。
3.第二句使用std空间中的locale函数设置所用的字符集,在linux环境中的可用字符集使用locale -a获取。
4.三四两句将该字符集应用于wcin和wcout流中。
5.很多文章中提到的locale loc("chs")方法并不适用于linux系统,windows下是否可行本文没有测试。
相关文章推荐
- C++ wchar_t 输出中文问题
- 『C/C++』关于 wcout 输出中文的问题
- 中文在C/C++中的处理和汉字乱码问题(wchar_t)
- 中文在C/C++中的处理和汉字乱码问题(wchar_t)
- 中文在C/C++中的处理和汉字乱码问题(wchar_t)
- [C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
- 【C++基础]007_char、wchar_t、wcout、setlocale() 解决中文不能输出显示
- Qt creator的"纯c/c++项目"输出中文乱码的问题
- [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
- [C++] cout、wcout无法正常输出中文字符问题的深入调查(2):VC2005的crt源码分析
- [C++基础]cout与wcout,printf与wprintf,ofstream与wofstream关于输出中文的问题解决
- Java笔记5:解决MyEclipse控制台输入中文乱码输出问题(Eclipse也可以用)
- Eclipse控制台输出中文乱码问题的解决
- 使用servlet编程,解决输出到页面的中文显示乱码问题。
- JAVA与C++::关于JNI中文字符串操作问题总结
- 在servlet中用outputStream输出数据的问题,以及输出中文的问题
- 2016/6/20 javaweb 编码—文件输出头不同浏览器中文编码问题
- C++中关于string类型究竟能不能用cout输出的问题
- C++问题---Zigzag数组输出
- 用PrintWriter解决servlet的中文输出问题