Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 深入 printf / wprintf / console下的unicode output
【标  题】:深入 printf / wprintf / console下的unicode output
【关键字】:printf,wprintf,console,unicode,output
【来  源】:http://www.cppblog.com/sandy/archive/2006/06/21/8779.html

深入 printf / wprintf / console下的unicode output

Your Ad Here 1. printf 只能提供ANSI/MB 的输出,不支持输出unicode stream.
例如:
wchar_t?test[]=L"测试1234";
printf(
"%s",test);
是不会正确输出的


2.wprintf 同样不会提供unicode output,
?? 但是他会把wchar_t的string转为locale的SB/MB字符编码,然后输出
例如:
wchar_t?test[]?=?L"测试Test";
wprintf(L
"%s",test);
会输出??1234之类的字符串,或者不输出任何结果
因为wprintf没有办法把L"测试Test"转为默认的ANSI,需要设置locale
setlocale(LC_ALL,"chs");
wchar_t?test[]?
=?L"测试Test";
wprintf(L
"%s",test);
会有正确的输出

综上:? CRT I/O functions do not provide Unicode output.

3. Window console自从NT4就是一个真正的unicode console
不过输出unicode string,只有使用Windows API, WriteConsoleW
例如:
wchar_t?test[]?=?L"测试1234";
DWORD?ws;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),test,wcslen(test),
&ws,NULL);
可以正确的输出而不需要设置locale,因为是真正的unicode的输出,跟codepage无关

4. 如何实现跨平台的console output
??? 不要使用wchar_t和wprintf,因为这些都依赖于编译器.
???? ICU是IBM的一个成熟的跨平台支持unicode的libary,推荐使用

以下是ICU的uprintf实现

void?uprintf(const?UnicodeString?&str)?{
????
char?*buf?=?0;
????int32_t?len?
=?str.length();
????int32_t?bufLen?
=?len?+?16;
????int32_t?actualLen;
????buf?
=?new?char[bufLen?+?1];
????actualLen?
=?str.extract(0,?len,?buf/*,?bufLen*/);?//?Default?codepage?conversion
????buf[actualLen]?=?0;
????printf(
"%s",?buf);
????delete?buf;
}
它也是先把Unicode string转化为本地的codepage,然后printf,虽然也不是unicode output,但是跨平台,大多数情况会工作得很好。
查找字符串的哈希方法(zz):【上一篇】
我所理解的插入排序算法:【下一篇】
【相关文章】
  • 如何改变iSeries Console设置 ?
  • 没有CONSOLE的场合,能重新激活已结束的QINTER子系统吗?
  • ANSI版本保存的文件,在UNICODE时是否依然能读入?
  • 在ASP中自动检测文件的编码格式,支持UTF-8、GB2312、UTF-7、Unicode、Unicode Swap等格式的检测
  • SRM Console
  • 中文与unicode互转
  • SAM CONSOLE
  • 最近会整理一下Linux console的构架
  • 捕获.NET Console应用程序的退出事件
  • 在DLEPHI中读取unicode文件
  • 【随机文章】
  • wu-ftpd下如何限值单个用户进程数
  • creats DVD.iso from CD.isos.
  • 清单标记
  • 反病毒反垃圾邮件系统构建HOWTO(5)
  • Oracle初学者笔记终结篇--集合和成员函数
  • 软件过程改进(SPI)常见反模式:第22条军规
  • Gmail悄悄变脸,提供12种语言界面
  • Boost.Asio 0.37简介(翻译自Boost.Asio 0.37的文档的首页)
  • 学习手记,网文摘录--C#验证输入的是否数字的方法
  • 关于软件开发团队的一些思考
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.