解决使用VC运行时库函数wprintf和wcount显示中文不正确的问题
来源:互联网 发布:8月宏观数据 编辑:程序博客网 时间:2024/06/03 13:42
昨天,我测试了C运行时库的Locale方面的函数,发现了一些疑问,好像现在相通了。我的测试代码如下:
{
char* paName = "测试中";
wchar_t* pwName = L"测试中";
printf(paName); //输出为:测试中
wprintf((wchar_t*)paName); //输出为:空
printf((char*)pwName); //输出为:乱码
wprintf(pwName); //输出为:空
}
如果将程序改写如下,则输出的结果就不一样了
{
char* paName = "测试中";
wchar_t* pwName = L"测试中";
setlocale(LC_ALL, "chs");
printf(paName); //输出为:测试
wprintf((wchar_t*)paName); //输出为:空
printf((char*)pwName); //输出为:乱码
wprintf(pwName); //输出为:测试
}
从上面两个代码片断可以看出:setlocale()对printf()没有影响,同时对char*的字符串也没有影响。唯一受到影响的是wprintf()这个函数了。我通过调试器查看了paName和pwName的字符,他们分别是:
paName :b2e2 cad4 d6d0 …… 应该是CHS编码(也就是代码页936)
pwName :4b6d d58b 2d4e …… Unicode编码
我昨天的疑问是:wprintf()应该是用来显示Unicode编码的,那么在没有调用setlocale()函数应该能够正常显示pwName所指的字符串,因为pwName所指的字符串正是Unicode编码的字符串;而在调用了setlocale()之后,wprintf()应该是用来显示本地字符串的(在本例中本地代码也就是936),将本地字符串转换成Unicode字符之后再显示,所以不能够将pwName所指的Unicode字符串显示出来。但是,好像结果却是相反的。
今天,我才想通了。我上面的阐述中假设了一个条件:即显示器在显示的时候是显示Unicode字符串的。如果,这个前提条件刚好是相反的:即显示器在显示的时候是显示本地字符串的。那么按照我上面的推理,应该会和测试的结果相一致的。
〔疑问〕按照上面的推理,在分析wprintf((wchar_t*)paName)语句时还像和结果是不一致的。应该在没有使用setlocale()的代码片断中可以正常显示出来的。但是,不知道为什么不是这样?
答:刚才在深入的调试了C运行时库,发现我的想法是正确的,在wprintf()函数里面,调用了WideCharToMultiByte()函数,就是通过当前的Locale将Unicode的字符转换成本地字符。在不使用setlocale()的时候,wprintf()会使用默认的“C”locale判断给定的宽字符是否<255,如果大于255就返回错误,而不会进行显示。这也就是在没有setlocale()的情况下wprintf((wchar_t*)paName)不能显示的真正原因。我觉得,如果wprintf()不进行这种判断而直接将字符串给Console的话,就能够正确显示了。但是,VC++中的wcout就可以在没有设置locale的情况下正确输出paName,可能就是象我说的一样。
测试环境VC8
- 解决使用VC运行时库函数wprintf和wcount显示中文不正确的问题
- 解决使用VC运行时库函数wprintf和wcount显示中文不正确的问题
- wcout输出时显示不了中文 || 如何使用wprintf和wcout输出汉字
- wprintf 输出中文的问题
- 使用wprintf输出中文
- 一种解决运行程序报“应用程序配置不正确”的问题
- 一种解决运行程序报“应用程序配置不正确”的问题
- VC++2005 (CLI-C++) 中使用Pwlib和Opal时,运行时报错_CrtIsValidHeapPointer问题的解决!!
- VC++ 环境 使用开发GTK+程序的中文显示问题
- 解决WIn7无线网图标显示不正确的问题
- 使用cufft库函数时产生链接错误问题的解决
- 关于ubuntu系统启动时显示.dmrc权限不正确的问题的解决
- cout,wcout,printf,wprintf等函数的中文输出问题
- wprintf以及std::wcout输出中文的问题
- MyEclipse使用经验__中文显示问题的解决
- ubuntu pdf 中文显示不正确的解决方法
- Listview中图片加载使用Volley框架时,出现图片显示不正确的问题的解析
- 解决sublime text3显示中文小框框和运行浏览器时中文出现乱码。
- 个人发展的15种能力
- 职场减压八大招
- 全球IP地址分配对应表
- 计数器
- DELPHI数组越界引起的VCL地址溢出问题
- 解决使用VC运行时库函数wprintf和wcount显示中文不正确的问题
- 在CSDN安家,希望自己能在两年内技术上有所收获
- 使用自定义代码对数据池进行随机访问
- Asp.Net 学习资源列表
- C#读写文本文件
- 共享内存实现进程间大数据的交换
- 使用ARM开发详细步骤(转自http://blog.csdn.net/zswolf2000/archive/2005/12/28/563904.aspx)
- JavaScript基础知识
- Qte与Qt(转自http://blog.csdn.net/kevin881/archive/2005/01/03/238772.aspx)