MSVC下快速Unicode I/O
来源:互联网 发布:千兆路由器 知乎 编辑:程序博客网 时间:2024/06/13 04:04
http://blog.kingsamchen.com/archives/863
如果需要往console输出包含非ASCII字符的宽字符串,一个比较快速的方法是使用WriteConsoleW
这个API。
如果想兼容crt和STL的方式,例如使用wprintf
和std::wcout
,则可以用另一种快速的方法:使用_setmode
来改变底层的translation mode。
参考文档可以看这里,_fileno
从一个FILE*
得到对应的file descriptor,第二个参数指定目标模式。
对比其他需要设置locale的方法(要么通过setlocale
,要么通过STL的imbue
),前者很容易一个不小心就把其他设置也连着一块给改了;后者经常忘了怎么用。
额外福利
第二个参数还可以使用_O_U8TEXT
,这样系统I/O的时候会自动将wide-string转换成utf-8编码的字符串。利用_fileno
获取目标文件的描述符,则可以将宽字符直接以utf-8编码的方式输出到目标文件。
不过由于没有靠谱的方法从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
- Java的快速I/O
- Linux 下的I/o
- Linux 下的I/O
- Linux下的I/O
- I/O操作(下)
- linux下的I\O
- Linux下的I/O
- Linux下的I/O
- Linux下的I/O
- Linux下的I/O
- linux下I/O缓冲
- Linux下的I/O
- linux下I/O操作
- windows 下 Overlapped I/O
- 文件I/O(快速浏览)
- windows下快速转换unicode与ansi
- WINDOWS CE下I/O端口访问
- 页面缓存设置
- [转]设置修改CentOS系统时区/时间
- 信号量与PV操作
- MySQL5.6主从复制
- 使用eclipse查看hadoop源码
- MSVC下快速Unicode I/O
- 第六届南桥杯JavaA组 第五题 打印菱形
- 创建-跨站请求屏蔽,盗链屏蔽
- C++ explicit构造函数实例解析
- mybatis防止sql注入
- 不能被声明为虚函数的C++函数
- 服务器中的sites-available和sites-enabled的关系
- 擅长排列的小明 II
- csdn博客插入图片