http://blog.kingsamchen.com/archives/863

如果需要往console输出包含非ASCII字符的宽字符串,一个比较快速的方法是使用WriteConsoleW这个API。

如果想兼容crt和STL的方式,例如使用wprintfstd::wcout,则可以用另一种快速的方法:使用_setmode来改变底层的translation
mode。

1
2
3
std::wstring ws = L"Fuckyou.我抢劫你什么,一百块都不给我";
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << ws;   // or using wprintf_s

参考文档可以看这里_fileno从一个FILE*得到对应的file descriptor,第二个参数指定目标模式。

对比其他需要设置locale的方法(要么通过setlocale,要么通过STL的imbue),前者很容易一个不小心就把其他设置也连着一块给改了;后者经常忘了怎么用。

额外福利

第二个参数还可以使用_O_U8TEXT,这样系统I/O的时候会自动将wide-string转换成utf-8编码的字符串。利用_fileno获取目标文件的描述符,则可以将宽字符直接以utf-8编码的方式输出到目标文件。

1
2
3
4
5
std::wstring
ws
=
L"Fuckyou.我抢劫你什么,一百块都不给我";
FILE*
fp
=
nullptr;
fopen_s(&fp,
"C:\\encoding.dat",
"w");
_setmode(_fileno(fp),
_O_U8TEXT);
fwrite(ws.data(),
sizeof(wchar_t),
ws.size(),
fp);

不过由于没有靠谱的方法从std::fstream中获取FILE*,所以这种方式的文件I/O不能使用STL的相关设施。

–EOF–

无论使用_O_U8TEXT还是_O_U16TEXT,源字符串都必须是宽字符串,系统会在IO的时候根据需要做自动的编码转换。

这种设计看起来比较吻合Windows现在的,以UTF-16/wide-string为内部编码,需要时(主要是涉及到文件I/O等)转换为其他编码思路。

C++11虽然已经开始提供各种utf编码标准设施,但是utf-8编码的字符串仍然要以u8为前缀,虽然现在VS2013以及VS14都没有迹象表明要支持这个特性,但是这个proposal起码不会破坏MSVC的原始行为,至少为未来实现留下一点可能。至于什么时候能用上这个设施,就看VS团队了。

MSVC下快速Unicode I/O的更多相关文章

  1. MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题

    今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...

  2. windows 7 下快速搭建php环境(windows7+IIS7+php+mysql)

    原文:windows 7 下快速搭建php环境(windows7+IIS7+php+mysql) 1).采用理由: 优点:最大化的桌面图形化操作系统,可维护性优秀.基于IIS v6.0/v7.0(20 ...

  3. Linux下快速搭建php开发环境

    php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XA ...

  4. JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构

    一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...

  5. CentOS 6.5下快速搭建ftp服务器[转]

    CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vs ...

  6. linux下快速安装jenkins

    Linux下快速安装Jenkins 建议使用 FileZilla 工具简化以下步骤中移动.环境变量配置等步骤. 1      软件下载 l  Java:jdk-7u17-linux-x64.tar.g ...

  7. 【转】VC下的Unicode编程

    转自http://www.leewei.org/?p=1304 UniCode简述 在Windows下用VC编程,如果编写的程序要在多种语言环境下运行(比如日文.中文.葡萄牙文等),使用VC默认的MB ...

  8. Centos7下快速安装Mongo3.2

    Centos7下快速安装Mongo3.2 一般安装Mongo推荐源码安装,有时候为了快部署测试环境,或者仅仅是想装个mongo shell,这时候yum安装是最合适的方式, 下面介绍一下如何在Cent ...

  9. windows下快速修改host文件

    windows下快速修改host文件 win+r  输入 notepad c:\Windows\System32\drivers\etc\hosts

随机推荐

  1. CSS常见的继承属性

    时间过得很快参加工作半个月了,利用属性的继承性可以有效提高代码的阅读性. 这里是我个人总结的,虽然不全,但是常见: 1.字体系列属性 font-family:字体系列 font-weight:字体的粗 ...

  2. JAVA8学习——Stream底层的实现三(学习过程)

    Stream的深入(三) 心得:之前学习流,深入了流的底层.但是学的这些东西在平时日常开发的过程中,是根本不会用到的.只是为了更好帮助自己去理解流的底层设施.用起来也更自信,能够确定用的东西非常正确. ...

  3. Ubuntu 18.04 + ROS Melodic + TurtleBot3仿真

    1. 下载安装包 官网地址: http://wiki.ros.org/action/show/Robots/TurtleBot?action=show&redirect=TurtleBot 所 ...

  4. Scala:用于Java的轻量级函数式编程

    Scala为Java开发提供了轻量级的代码选项,但是学习过程可能会很艰难.了解有关Scala的知识以及是否值得采用. 基于Java的语言通常涉及冗长的语法和特定于领域的语言,用于测试,解析和数值计算过 ...

  5. 比特币学习笔记(一)---在windows下编译搭建比特币环境

    最近打算研究下比特币源码,却发现这套源码正常情况下得在linux下编译运行,而我的机器是windows的. 怎么办呢? 起初打算用mingw和cygwin搞搞看,试了许久后发现行不通,必须转到linu ...

  6. Linux下Docker的安装与使用

    yum安装Docker最新版和docker-compose(超级简单的安装方法) Install Docker 首先安装依赖 yum install -y yum-utils device-mappe ...

  7. Alodi:环境创建从未如此简单

    一个满足你各种想象的快速方便生成临时环境的系统 在『Alodi:为了保密我开发了一个系统』文章中有讲到我们开发了一个系统用来快速生成临时测试环境,短短三个月已有数百个环境被创建,简化了工作,节省了时间 ...

  8. echart两组柱状图对比时,不同类型根据各类型的最大值为基准进行展示

    项目中遇到的问题:因为数据太小,箭头的地方展示不出来,这时的两组对比数据是根据一个最大值为基准进行渲染的.但我们想实现不同类型的对比根据不同的基准值渲染. 理想效果如下图: 实现代码: option ...

  9. python打印图形

    i = 0 while i < 5: # print('*****') 效果与下行相同 print('*'*5) i+=1 print('\n\n') i = 1 while i < 6: ...

  10. 发布到远程存储库时遇到错误: Git failed with a fatal error.

    正在推送 master发布到远程存储库时遇到错误: Git failed with a fatal error.Authentication failed for 'http://1212121xxx ...