wprintf 和 wcout

这篇文章应该是[netsin]的成果,我勤快,记下来。
注:wprintf是C的标准库函数,但wcout不是C++的标准成员,C++中的 L"……" 是宽字符,却未必是unicode字符,这与编译器实现相关。
[乾坤一笑]说:为什么 C/C++ 语言把 L"xx" 定义为由实现决定的呢?这显然是为了 C/C++ 的普适性、可移植性。Bjarne 的观点认为,C++ 的方式是允许程序员使用任何字符集作为串的字符类型。另外,unicode 编码已经发展了若干版本了,是否能永久适合下去也不得而知。有关 unicode 的详细论述以及和其它字符集的比较,我推荐你看《无废话xml》。

以下两段代码的执行环境是 windows xp professional 英文版,编译器是 VS2005RTM。

// C
#include <stdio.h>
#include <locale.h>
int main( void )
{
    setlocale( LC_ALL, "chs" );
    //setlocale( LC_ALL, "Chinese-simplified" );
    //setlocale( LC_ALL, "ZHI" );
    //setlocale( LC_ALL, ".936" );
    wprintf( L"中国" );

return 0;
}

// C++
#include <iostream>
#include <locale>
using namespace std;
int main( void )
{
    locale loc( "chs" );
    //locale loc( "Chinese-simplified" );
    //locale loc( "ZHI" );
    //locale loc( ".936" );
    wcout.imbue( loc );
    std::wcout << L"中国" << endl;

return 0;
}

说明:别混合使用 setlocale 和 std::locale 。

------------------------- 2006-07-05 记 -------------------------

"VC知识库"                        编码为:56 43 D6 AA CA B6 BF E2 00                            // ANSI编码
L"VC知识库" 在VC++               中编码为:56 00 43 00 E5 77 C6 8B 93 5E 00 00                   // (windows口中的unicode)编码
L"VC知识库" 在GCC(Dev-CPP4990) 中编码为:56 00 43 00 D6 00 AA 00 CA 00 B6 00 BF 00 E2 00 00 00 // 只是将ANSI编码简单的加0
L"VC知识库" 在GCC(Dev-CPP4992) 中编译失败,报 Illegal byte sequence

L"VC知识库" 在 Dev-CPP4992 中解决步骤为:
a. 将文件保存为 utf-8 编码                                          // utf-8 是unicode的其中一种,但和(windows口中的unicode)不一样
b. 去掉BOM头:用二进制编辑器(比如VC)去掉刚才utf-8文件的前三个字节 // Linux/UNIX并不使用BOM
c. 使用 gcc/g++ 编译运行

经过以上解决步骤,在 dev-cpp4992 中
 "VC知识库" 编码为: 56 43 E7 9F A5 E8 AF 86 E5 BA 93 00 // utf-8编码,注意不再是ANSI编码了,因此用 printf/cout 将输出乱码
L"VC知识库" 编码为: 56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)编码

补充:在mingw32中使用wcout和wstring需要加一些宏,比如
#define _GLIBCXX_USE_WCHAR_T 1
#include <iostream>
int main( void )
{
    std::wcout << 1 << std::endl;
}
可以编译通过,但无法Link通过,在网上google了一下,stlport说mingw32有问题,mingw32说是M$的c runtime有问题。

------------------------- 2007-01-05 记 -------------------------
一个多字节字符串和宽字符字符串互相转化的事例
#define _CRT_SECURE_NO_WARNINGS // only for vc8
#include <string>
#include <clocale>
#include <cassert>
inline const std::string to_mbcs( const std::string& src )
{
    return src;
}
const std::string to_mbcs( const std::wstring& src )
{
    char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原来的locale
    setlocale( LC_CTYPE, "chs" ); // 设置当前locale为chs,这在非简体中文平台上不可缺少

size_t count1 = wcstombs( NULL, src.c_str(), 0 ); // 计算新字符串长度
    std::string des( count1, ' ' );
    size_t count2 = wcstombs( &des[0], src.c_str(), count1 ); // 转化
    assert( count1 == count2 );

setlocale( LC_CTYPE, old_locale ); // 恢复到原来的locale
    free( old_locale );

return des;
}
inline const std::wstring to_wcs( const std::wstring& src )
{
    return src;
}
const std::wstring to_wcs( const std::string& src )
{
    char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原来的locale
    setlocale( LC_CTYPE, "chs" ); // 设置当前locale为chs,这在非简体中文平台上不可缺少

size_t count1 = mbstowcs( NULL, src.c_str(), 0 ); // 计算新字符串长度
    std::wstring des( count1, L' ' );
    size_t count2 = mbstowcs( &des[0], src.c_str(), count1 ); // 转化
    assert( count1 == count2 );

setlocale( LC_CTYPE, old_locale ); // 恢复到原来的locale
    free( old_locale );

return des;
}

#include <iostream>
int main( void )
{
    using namespace std;

cout << to_mbcs("你好1") << endl;
    cout << to_mbcs(L"你好2") << endl;

const locale loc( "chs" );
    wcout.imbue( loc );
    wcout << to_wcs("你好3") << endl;
    wcout << to_wcs(L"你好4") << endl;
}

------------------------- 2008-09-03 记 -------------------------
参见 《MBCS To Unicode 》

[转自周星星的blog] 解决为什么wcout不能输出中文问题相关推荐

  1. linux wcout 输出中文,解决为什么wcout不能输出中文问题

    转自http://www.cnblogs.com/moonz-wu/archive/2008/12/30/1365552.html wprintf 和 wcout 这篇文章应该是[netsin]的成果 ...

  2. 解决AndroidStudio 控制台编译输出中文乱码,黑方块+问号之类的

    [100%有效]解决AndroidStudio 控制台编译输出中文乱码(黑色方框问号),亲测解决!(转载)_Pdx_666的博客-CSDN博客背景在AndroidStudio中新建了一个Java Mo ...

  3. 解决java以UTF-8输出中文时,Excel打开多语言文件乱码但是记事本打开却正常的问题

    解决java以UTF-8输出中文时,Excel打开多语言文件乱码但是记事本打开却正常的问题 public static boolean exportCsv(File file, List dataLi ...

  4. 解决IntelliJ IDEA控制台输出中文乱码问题(图文详解)

    解决IntelliJ IDEA控制台输出中文乱码问题(图文详解 前言 第一步(打开idea的bin目录) 第二步(打开idea) 第三步(关闭idea,重新打开即可)![请添加图片描述](https: ...

  5. 解决idea中不能输出中文问题

    在CSDN上查明了问题: 解决方法: >>>>>打开idea,点在左上角的File,找到Settings,点击找到File Encodings然后看上面的Global E ...

  6. 解决IntelliJ IDEA控制台输出中文乱码 淇℃伅

    一.情况: 运行Tomcat,控制台输出中文乱码,如图所示: 二:解决方法: 1.找到Tomcat安装目录--conf文件夹--logging.properties文件 2.将文件中的UTF-8全部改 ...

  7. eclipse中文乱码解决_已解决-解决IntelliJ IDEA控制台输出中文乱码问题

    作者:宜春 原文链接:https://zhuanlan.zhihu.com/p/94412052 IntelliJ IDEA 真的是一款很方便的Java开发工具,但是关于中文乱码这个问题我不得不吐槽, ...

  8. 【六种方案】【idea】最全解决IntelliJ IDEA控制台输出中文乱码问题

    解决方案 版本过高 idea VM 修改 配置项目编码 encodings.xml 编辑配置 文件编码 修改后记得重启 版本过高 高版本引起输出乱码. 已知2022年7月12日为止,Java 18输出 ...

  9. 解决Vs输出中文乱码的问题

    解决Vs输出中文乱码的问题 原文:https://blog.csdn.net/c_khalid/article/details/51515675 源程序的运行结果是:中文乱码 首先,这个与VS本身无关 ...

最新文章

  1. 【武书连】2021 中国一流大学名单(30 所)和中国大学综合实力 700 强出炉!
  2. 操作像素(一)--存取像素值
  3. 如何在Angular.js选择框中使用默认选项
  4. 探究Facebook相似性搜索工具 faiss的原理
  5. 【分析】2014移动互联网数据报告(终极版必收!)
  6. 925. Long Pressed Name 长按键入
  7. struts2从一个action跳到另一个action的配置方法
  8. html5扫面二维码逻辑
  9. JVM-类加载、GC回收机制
  10. node express框架实现下载文件功能
  11. C语言基础知识快速入门(全面)
  12. luogu 2735 电网 皮克公式
  13. python处理ts_python将ts转换成MP4
  14. 一:【博客分享】优秀的有趣的博客
  15. 量化交易员珍藏的10本书,一般人不会教你的事
  16. 一个简单的HTML网页
  17. 人工智能基础-数学方法-数理统计
  18. 矩阵关于26的模逆matlab,给定加密矩阵在模运算下的逆矩阵.ppt
  19. Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)
  20. 音视频解封装:MP4核心Box详解及H264AAC打包方案

热门文章

  1. 判断一组checkbox中是否有被选中的
  2. 4 weekend110的hive入门
  3. 使用NuGet安装EntityFramework4.2
  4. Java Formatter 阅读心得
  5. C#程序设计语言2.0简介
  6. pdf页眉页脚设置步骤
  7. java基础-多线程应用案例展示
  8. 点击APPicon之后都发生了什么
  9. Wannafly挑战赛14 F
  10. 多对多关联映射(双向关联)见项目:me_many_to_many