注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

dp: 生活的脚步,进步的点滴...

Cam、DSP、FPGA、PM、Life、More ...

 
 
 

日志

 
 

C++字符编码  

2014-10-16 13:52:25|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

百度“知道”中有人问以下代码有什么问题:

TCHAR tmpText[50]; 
sprintf(tmpText,"%d,%d", a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));

代码存在几个与文字编码有关的问题。提问者这样写,说明他对++中文字编码相关的知识还是不太了解。由于字符编码牵涉的问题比较多,我就决定写一篇文章来说明一下。

char与wchar_t

char中存放的是多字节型的字符,wchar_t中存放的是双字节型的字符,TCHAR在定义了_UNICODE时等同于wchar_t,在未定义_UNICODE时等同于char。

sprintf、wsprintf、_stprintf

sprintf是c++运行时库中的一个函数。c++ 运行时库处理字符串的函数通常都有2个版本,一个处理多字节型的字符,一个处理双字节型的字符。对于sprintf来说,它本身用于处理单字节字符,其双字节字符版本名为wprintf。
为了使用方便,c++运行时库还为每个处理字符串的库函数定义了一个宏,sprintf对应的宏的名字为_stprintf,这个宏在定义了_UNICODE时等同于wsprintf,在未定义_UNICODE时等同于sprintf。


问题本身

sprintf处理单字节字符,它就只能接收char类型的字符串。所以,如果当前定义了_UNICODE宏,那么tmpText中的字符的类型就是wchar_t. 它就不能传给sprintf.

要使第二行代码没有问题,要么把tchar换成char,要么把sprintf换成tsprintf。由于TextOut接收tchar类型的字符串,所以不能将tchar换成char,那只能把sprintf换成tsprintf。 sprintf换成tsprintf后,其第二个参数也需要加上_T()宏,以便将其转换为tchar类型。修改结果如下:

TCHAR tmpText[50]; 
_stprintf(tmpText,_T("%d,%d"), a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));

如果项目中没有定义_UNICODE宏,那么整段代码就可以通过编译。但是这样的写法是有问题的,应该将代码改为:

char tmpText[50]; 
sprintf(tmpText,"%d,%d", a, b); 
TextOut(hDC, x, y, tmpText,lstrlen(tmpText));


_T与L的区别:

_T("")是一个宏,定义于tchar.h下。

       #define _T(x) _ _T(x)  

       #ifdef  _UNICODE

       #define _ _T(x) L ## x

  #else   /* ndef _UNICODE */

       #define _ _T(x)      x

  它的作用是让你的程序支持Unicode编码

  _T和L的区别在于,L不管你是以什么方式编译,一律以UNICODE方式保存。

引号前面的大写字母L(代表「long」)。这将告诉编译器该字串按宽字符保存——即每个字符占用2个字节。


关于C++字符串编码,推荐阅读以下两篇文章:
http://www.codeproject.com/KB/string/cppstringguide1.aspx
http://www.codeproject.com/KB/string/cppstringguide2.aspx



  评论这张
 
阅读(350)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016