MSVC下快速Unicode I/O
http://blog.kingsamchen.com/archives/863
如果需要往console输出包含非ASCII字符的宽字符串,一个比较快速的方法是使用WriteConsoleW
这个API。
如果想兼容crt和STL的方式,例如使用wprintf
和std::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的更多相关文章
- MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题
今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...
- windows 7 下快速搭建php环境(windows7+IIS7+php+mysql)
原文:windows 7 下快速搭建php环境(windows7+IIS7+php+mysql) 1).采用理由: 优点:最大化的桌面图形化操作系统,可维护性优秀.基于IIS v6.0/v7.0(20 ...
- Linux下快速搭建php开发环境
php开发环境快速搭建 一.Linux下快速搭建php开发环境 1.安装XAMPP for Linux XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建站集成软件包,使用XA ...
- JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构
一.简介 JAVA中调用LevelDB用于Linux和Window环境下快速存储KV结构 二.依赖 <!-- https://mvnrepository.com/artifact/org.fus ...
- CentOS 6.5下快速搭建ftp服务器[转]
CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vs ...
- linux下快速安装jenkins
Linux下快速安装Jenkins 建议使用 FileZilla 工具简化以下步骤中移动.环境变量配置等步骤. 1 软件下载 l Java:jdk-7u17-linux-x64.tar.g ...
- 【转】VC下的Unicode编程
转自http://www.leewei.org/?p=1304 UniCode简述 在Windows下用VC编程,如果编写的程序要在多种语言环境下运行(比如日文.中文.葡萄牙文等),使用VC默认的MB ...
- Centos7下快速安装Mongo3.2
Centos7下快速安装Mongo3.2 一般安装Mongo推荐源码安装,有时候为了快部署测试环境,或者仅仅是想装个mongo shell,这时候yum安装是最合适的方式, 下面介绍一下如何在Cent ...
- windows下快速修改host文件
windows下快速修改host文件 win+r 输入 notepad c:\Windows\System32\drivers\etc\hosts
随机推荐
- 力扣142——环形链表 II
原题 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos ...
- 「Luogu P3183」[HAOI2016]食物链 解题报告
身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ...
- C语言关键字const作用及其应用
只要学过C语言的,都有知道const这个关键字,知道是用来定义常量的,如果一个变量被const修饰,那么它的值就不能再被改变,那么还有什么其他作用呢? 一.const常用作用 1.修饰局部变量 con ...
- 百度地图开发API
JavaScript API http://lbsyun.baidu.com/index.php?title=jspopular
- css label两端对齐
上面这种效果很常见,实现的代码如下: html部分 <ul> <li class="detail_item"> <span class="d ...
- VueRouter爬坑第四篇-命名路由、编程式导航
VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...
- cf 450b 矩阵快速幂(数论取模 一大坑点啊)
Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...
- 获取当前URL
HttpContext.Current.Request.Url.ToString();
- SpringCloud之Eureka(注册中心集群篇)(三)
一:集群环境搭建 第一步:我们新建两个注册中心工程一个叫eureka_register_service_master.另外一个叫eureka_register_service_backup eurek ...
- web网页设计五种布局
1.大框套小框布局 2.通栏布局 3.导航栏在主视觉下方的布局 4.左中右布局 5.环绕式布局