麒麟子

~~

导航

<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(12)

随笔分类

随笔档案

Friends

WebSites

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜

字符输出与编码集的问题。

今天早上起来就兴致脖脖地开始编写引擎的Log输出工具。 一个小时后,基本上完功。 经测试时才发现,原来_tprintf在Unicode下不能输出中文。求解未果,只好去上班了。
  晚上回来继续完善早上的工作,将Log输出做成了可以重定向的层次结构,并放入了一个可以共享的Share动态库中。这样就可以保持Log输出系统的唯一和共享(静态Lib中共无法共享).
      用百度搜了一下这个输出问题,突然发现了其中奥妙,原来Unicode需要本地化信息。
  经测试发现了如下规律
/*
      C多  CU   非C多  非CU
stdio    1   0    1     1
iostream  1   1    0     0


可以得出
1、在多字节时,默认(C)风格下,二者都能输出中文。
2、在多字节时,非C风格下,cout不能输出中文
3、在U时,默认C风格下,print不能输出中文
4、在U时,非C风格下,cout不能输出中文


由此可知,要在C风格下,iostream才能输出中文。
而printf只有在C风格的Unicode下才不能输出中文,其它均可。

*/

测试代码如下
#include <iostream>
#include <tchar.h>
#include <locale>
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _UNICODE
 _tsetlocale(LC_CTYPE,TEXT(""));
#endif
 _tprintf(TEXT("a在哪里啊\n"));
#ifdef _UNICODE
 _tsetlocale(LC_CTYPE,TEXT("C"));
#endif


#ifdef _UNICODE
 std::wcout<<"d在哪里啊"<<std::endl;
#else
 std::cout<<"d在哪里啊"<<std::endl;
#endif
 getchar();
 return 0;
}

posted on 2010-08-19 01:19 麒麟子 阅读(266) 评论(0)  编辑 收藏 引用 所属分类: Programming


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理