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
随机推荐
- Appium环境搭建超详细教程
前言: 本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现自由抓取App中想要的资源. 本系列以后会更的: Appium基本使用及控制真机及安卓模拟器 Mitmproxy抓包工 ...
- 异常记录——bat批处理闪退
bat批处理闪退 bat描述 我的博客每次更新需要跑多个命令 clean(清除旧文)+g(生成新文)+d(部署到服务器),作为一个懒惰的程序员,自然要写一个bat一键完成 E: cd blog hex ...
- Nginx 核心配置详解
目录 Nginx 核心配置详解 Nginx 四层访问控制: Nginx账户认证功能: 自定义错误页面: 自定义访问日志: 检测文件是否存在: 长连接配置: 作为下载服务器配置: 作为上传服务器: 其他 ...
- Spring(一)开篇
目录 1.Spring 介绍 2.Spring 框架的演变 3.Spring 整体架构 Core Container Data Access/Integration Web AOP Test 最后 1 ...
- Java8 通关攻略
点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 Java8早在2014年3月就发布了,还不得全面了解下 本文是用我拙劣的英文和不要脸的这抄抄那抄抄,熬 ...
- rest实践2
通过url读取图片资源 其他的上传图片和对应的添加信息到数据库等的相关操作则引入crud来操作,编写相关代码的话==>要引入相关的crud包.
- 6441. 【GDOI2020模拟01.17】小 ω 维护序列
Description Input Output 输出到标准输出流中. 若干行,对于每个操作 1 和操作 5,输出一个数表示答案. Sample Input Sample Input1 5 8 1 2 ...
- Manacher 学习
推荐博客 :https://blog.csdn.net/zzkksunboy/article/details/72600679 作用 线性时间解决最长回文子串问题. 思想 Manacher充分利用了回 ...
- 村庄之间建立邮局 - 区间 dp
There is a straight highway with villages alongside the highway. The highway is represented as an in ...
- 16. 产生Javadoc
过程与export >> javadoc一致,需要注意的是字符集的设置. -encoding UTF-8 -charset UTF-8 export >> javadoc : ...