您的位置:首页 > 编程语言 > C语言/C++

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下是否可行本文没有测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: