控制台输出宽字符wchar_t的中文显示问题

在缺省的C locale下,cout可以直接输出中文,但对于wcout却不行(至少VS 2005下不行)。对于wcout,需要将其locale设为本地语言才能输出中文:

wcout输出时显示不了中文,加上下面这句就行了。

std::wcout.imbue(std::locale("chs"));

-----------------------------------------------------------------------------

#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下是否可行本文没有测试。
————————————————
版权声明:本文为CSDN博主「charles_ma」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/charles_ma/article/details/7268101

1.采用ansi编码方式,在ubuntu下会出错,另外通过g++ -Wall -finput-charset=ISO-8859-1 test.cpp 方式可以指定输入文件格式,但是这样很麻烦,因为首先要知道文件的格式是什么,在ubuntu下 通过file  test.cpp 命令可以查到,我把ISO-8859-1到ISO-8859-16都试了,文件编码格式ANSI(即ISO8859-XX)且文件中有L"国家" 类似字符,编译不会通过,或者通过-finput-charset=xxx指定文件格式编译通过后输出也不对,故太麻烦。

2.在windows下和ubuntu下都通过的方式是文件编码采用UTF-8。

3.printf和wprintf不能混用,即一个程序中使用了printf, 就不使用wprintf,反之也是,既然printf输出char 和 wchar_t字符都可以,所以统一使用printf是最佳选择。

当然使用printf打印wchar_t时格式不一样,是%ls 或大写的%S,  例如: printf("wide char: %ls\n", ws);

4. 一旦要打印中文字符,在程序初始化时加一句setlocale(LC_ALL, ""); 否则打印中文会出错。

5. windows 对 字符串的内部编码比较统一,char的编码都成ANSI,如 char  s[] = "国家", s里存的是”国家”的ANSI编码

wchar_t的编码都成UCS-2,如 wchar_t  ws[] = L"国家", s里存的是”国家”的UCS-2编码

UBUNTU 对字符串的处理不是很统一,char 字符串的编码是随着文件编码格式有所变化,如文件为ansi,则ubuntu也为ansi,文件为UTF-8, 则char s[] = "国家" 里的也是            UTF-8编码。

wchar_t 则默认采用ucs-4编码。

总结:源代码文件编码用UTF-8, 打印采用printf是跨平台(操作系统,编译器), 跨char和wchar_t的最佳解决方案之一,另外不能忘了 setlocale(LC_ALL, "");

说的再多,不如自己测试下,如下为测试代码,一共有5种case,每次注释掉其他case,留要测试的case,并按照case注释处更改文件编码方式便可, 更改编码方式采用notepad++最方便了.

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <wchar.h>
#include <locale.h>

// 测试运行环境:
// ubuntu 12.04 + g++ 4.6.3(或gcc,改文件后缀就行)
// windows 7 + vs2012
// 说明,在注释中说的编码E59BBD,是按照打印结果从低字节到高字节排练,并不一定和实际
// 的编码大小端一致。

int main()
{
    //此语句重要,在win7 + vs2012和 ubuntu 12.04测试结果一致,只要打印wchar_t字符,均加此语句,否则出错。
    setlocale(LC_ALL, "");        

    /******************  case 1  **********************************/
    // 文件utf-8编码, 字符串不加L
    // ubuntu : ws是utf-8编码: 如"国":E59BBD; 打印结果:国家
    // windows: ws是ansi编码: 如"国":b9fa; 打印结果: 国家
/*     char ws[] = "国家";
    char *p = (char *)ws;
    int i = 0;

    printf("sizeof(ws) is %d\n", sizeof(ws));
    for (; i < sizeof(ws); i++){
        printf("byte: %x\n", p[i]);
    }
    printf("content start\n");
    printf("%s\n", ws);
    printf("content end\n");        */  

        /******************  case 2  **********************************/
    // 2: 文件ansi编码, 字符串不加L
    // ubuntu : ws是ansi编码,如"国":b9fa; 打印结果:无,出错
    // windows: ws是ansi编码: 如"国":b9fa; 打印结果: 国家
/*       char ws[] = "国家";
    char *p = (char *)ws;
    int i = 0; 

    //setlocale(LC_ALL, "zh_CN.UTF-8");
    printf("sizeof(ws) is %d\n", sizeof(ws));
    for (; i < sizeof(ws); i++){
        printf("byte: %x\n", p[i]);
    }
    printf("content start: %s\n", ws);
    printf("content end\n");  */   

      /******************  case 3  **********************************/
    // 3: 文件utf-8编码, 字符串加L, 必须采用wchar_t, 用char编译器报错, 用wprintf打印
    // ubuntu : ws是ucs-4编码,如"国":0x000056fd; 打印结果:国家
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家
/*     wchar_t ws[] = L"国家";
    char *p = (char *)ws;
    int i = 0;      

    wprintf(L"sizeof(ws) is %d\n", sizeof(ws));
    for (; i < sizeof(ws); i++){
        wprintf(L"byte: %x\n", p[i]);
    }
    wprintf(L"wprintf content start:\n");  //必须用wprintf, 且wprintf和printf不能同时使用.
    wprintf(L"%ls\n", ws);
    wprintf(L"content end\n");    */          

        /******************  case 4  **********************************/
    // 4: 文件utf-8编码, 字符串加L, 必须采用wchar_t, 用char编译器报错, 用printf打印
    // ubuntu : ws是ucs-4编码,如"国":0x000056fd; 打印结果:国家
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家
    wchar_t ws[] = L"国家";
    char *p = (char *)ws;
    int i = 0;      

    printf("sizeof(ws) is %d\n", sizeof(ws));
    for (; i < sizeof(ws); i++){
        printf("byte: %x\n", p[i]);
    }        

    printf("printf content start:\n");  //wprintf和printf不能同时使用.
    printf("%ls\n", ws);
    printf("content end\n");

    /******************  case 5  **********************************/
    // 5: 文件ansi编码, 字符串加L, 必须采用wchar_t, 用char编译器报错
    // ubuntu : 编译不通过
    // windows: ws是ucs-2编码: 如"国":0x56fd; 打印结果: 国家
/*     wchar_t ws[] = L"国家"; // 文件ansi编码,ws是unicode编码: 如国:56fd
    char *p = (char *)ws;
    int i = 0;    

    wprintf(L"sizeof(ws) is %d\n", sizeof(ws));
    for (; i < sizeof(ws); i++){
        wprintf(L"byte: %x\n", p[i]);
    }
    wprintf(L"wprintf content start:\n");  //必须用wprintf, 且wprintf和printf不能同时使用.
    wprintf(L"%ls\n", ws);
    wprintf(L"content end\n");   */       

    while(1); //方便看结果
    return 0;
}      

————————————————
版权声明:本文为CSDN博主「xiayuleWA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiayuleWA/article/details/32140493

原文地址:https://www.cnblogs.com/htj10/p/12112603.html

时间: 2024-08-05 12:45:43

控制台输出宽字符wchar_t的中文显示问题的相关文章

宽字符wchar_t和窄字符char——putwchar、wprintf

宽字符wchar_t 与 窄字符char 先说下窄字符char,这个大部分读者应该很清楚,char类型的变量占一个字节(byte)(也就是8个bit(比特)),能表示256个字符,那char的范围有两种 第一种(signed char):-128~127 第二种(unsigned char):0~255 (对char的范围感兴趣的读者可以看一下这篇文章:浅谈char类型范围) 但C标准并没有规定char 应该是unsigned还是signed,C标准定义了三种类型:char.signed cha

解决IntelliJ IDEA 控制台输出中文乱码问题

解决IntelliJ IDEA 控制台输出中文乱码问题 问题描述:如图,控制台输出的字符,乱码 解决方案 第一步:修改intellij idea配置文件: 找到Intellij idea安装目录,bin文件夹下面in的64.exe.vmoptions 和 idea.exe.vmoption这两个文件. 分别再这两个文件中添加: -Dfile.encoding=UTF-8 第二步:修改intellij idea中的设置 第三步:修改Tomcat的配置参数 第四步:重启IntelliJ IDEA即可

宽字符

1.宽字符是为了解决国际化,英文软件写好后,要发行到不同的国家,这时就需要使用宽字符,宽字符能把汉字当成一个字符. 2.字符集 <1>多字节字符集  (窄字符) <2>Unicode字符集(用来解决国际化)(宽字符) 3.MessageBox    MessageBox引用了windows.h文件. 宽字符与窄字符的区别:窄字符1字节,窄字符2字节. MessageBox这个函数与 设置有关,默认是unicode,这个设置应该只影响MessageBox函数吧. 宽字符有一个宏指令 

宽字符的坑

今天老大让我自己写一个String类 而且还是用宽字符wchar_t进行初始化,大坑,深坑,非常坑啊. 首先,宽字符组成的字符串,len和size并不相等 String类要仿照其他语言,做成一个固定大小的“死字符串” memcpy函数调用过程中,是传的void*,所以这时候就要小心,见如下代码: void String::append(const cqWCHAR* str){    size_t len = cq_wcslen(str);    size_t totalLength = this

Java代码工具箱之控制台输出重定向_控制台输出到文件

1. 情形:有时候控制台输出太多,在MyEclipse显示不全. 2. 说明:本代码只会重定向 system.out 的内容, error及其它不受代码影响.其它应该类似. 1 //自定导入必要库 2 //然后往 Main 的 最开始一塞即可 3 //文件是否会自动新建,未测试 4 5 try { 6 System.setOut(new PrintStream(new FileOutputStream("D:\\systemOut.txt"))); 7 } catch (FileNot

debian8最小化安装,字符界面的中文配置

一.现象: debian8最小化安装以后,字符界面的中文显示乱码. 二.解决 1. 安装locales apt-get install locales 2. 配置locales dpkg-reconfigure locales #配置编码,弹出编码配置选项框 进入选择:(空格键是选择,不是ENTER,选择完了后再ENTER) en_US.UTF8 //这个正常是默认选项 zh_CN GB2312 zh_CN GBK GBK zh_CN UTF-8 UTF-8 原文地址:https://www.c

宽字符和窄字符之间的转换,以及对中文的处理问题总汇

直接代码: 注:编译环境VS2010 SP1 1 /*实现宽字节和窄字符转换以及中文文件的输入输出*/ 2 3 #include <iostream> 4 #include <string> 5 #include <fstream> 6 #include <locale> 7 #include <codecvt> 8 #include <windows.h> 9 #include <tchar.h> 10 using na

ubuntu字符界面怎么设置中文显示和中文输入

在ubuntu的字符登陆界面,中文显示默认是乱码的,而且也不支持中文输入,解决方法有很多, 1)安装zhcon--解决中文显示乱码的问题. sudo apt-get install zhcon 然后ctrl+alt+F1~F6进入字符界面,然后输入sudo zhcon --utf8就可以了.不过只能解决中文显示乱码的问题.所以我更喜欢第二种方法. 2)解决中文显示乱码和中文输入的问题. 参考: http://www.playubuntu.cn/article/194.html http://ru

.Net Core 控制台输出中文乱码

Net Core 控制台输出中文乱码的解决方法: public static void Main(string[] args)        {            Console.OutputEncoding = System.Text.Encoding.UTF8;//第一种方式:指定编码            //Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//第二种方式