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. linux(raspbian)下mysql的安装,权限设置和用户管理

    一 MySQL安装:(1) 使用apt-get安装, 由于raspbian是基于Debian的自由操作系统,debian默认自带apt-get指令安装应用因此可以使用来安装 sudo apt-get ...

  2. spring cloud微服务快速教程之(四)熔断器(Hystrix)及其工具(Dashboard、Turbine)

    0-为什么需要熔断器 在分布式系统中,各个服务相互调用相互依赖,如果某个服务挂了,很可能导致其他调用它的一连串服务也挂掉或者在不断等待中耗尽服务器资源,这种现象称之为雪崩效应: 未来防止系统雪崩,熔断 ...

  3. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  4. window bat批处理 实用脚本

    一行一行读取txt里的内容 @echo off for /f %%i in (C:\Users\86132\Desktop\name.txt) do ( echo %%i>>name2.t ...

  5. cannot open git-upload-pack,cannot open git-receive-pack,Can't connect to any URI错误解决方法eclipse

    cannot open git-upload-pack,cannot open git-receive-pack,Can't connect to any URI错误解决方法eclipse 解决ecl ...

  6. Linux 7.5 SSH服务和SFTP服务分离

    SFTP是SSH的一部分,SFTP没有单独的守护进程,它必须使用SSHD守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像是一个服务器程序,而更像是一个客户端程序. ...

  7. 使用“1”个参数调用“DownloadString”时发生异常:“操作超时”

    我今天在终端美化时间遇到一个问题是这样的 使用“1”个参数调用“DownloadString”时发生异常:“操作超时” 然后网我看了下,访问链接属于https的东西,根据直觉我觉得是这样的,是由于访问 ...

  8. 一个DNS数据包的惊险之旅

    踏上旅程 “小子,快去查一下www.paypal.com的IP地址,我急用,晚了我弄你!”,暴躁老哥一把关上了门,留我一个DNS数据包在冷冰冰的房间. 过了一会儿,一位大叔打开了门,带着我来到了一座叫 ...

  9. ReactNative: 自定义ReactNative API组件

    一.简介 在前面介绍了很多ReactNative中UI组件和API组件,这些都是Facebook团队封装好的基础组件,开发者可以直接使用.然而,在实际的开发过程中,面对复杂的需求,此时原生的Nativ ...

  10. cogs 1829. [Tyvj 1728]普通平衡树 权值线段树

    1829. [Tyvj 1728]普通平衡树 ★★★   输入文件:phs.in   输出文件:phs.out   简单对比时间限制:1 s   内存限制:1000 MB [题目描述] 您需要写一种数 ...