C++中关于文字编码的问题
来源:互联网 发布:c 网络编程 源码 编辑:程序博客网 时间:2024/05/21 22:23
百度“知道”中有人问以下代码有什么问题:
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));
关于字符串,推荐你看一下这两篇文章:
http://www.codeproject.com/KB/string/cppstringguide1.aspx
http://www.codeproject.com/KB/string/cppstringguide2.aspx
- 关于PHP中文字编码的问题
- C++中关于文字编码的问题
- C++中关于文字编码的问题
- C++中关于文字编码的问题(格式化字符串)
- PHP关于文字编码的问题
- NSStringEncoding关于文字编码问题的解决方法
- 关于文字的编码
- 关于java中url编码的问题
- WebX中关于编码的问题
- php中关于string编码的问题
- 编码中关于size_t的一个问题
- Python3中关于中文编码的问题
- mysql中关于数据的编码问题
- Java中文字编码问题详解
- Java中文字编码问题详解
- Java中文字编码问题详解
- Java中文字编码问题详解
- Java中文字编码问题详解
- jzb
- Tomcat服务器 Manage App配置
- ARM9 2410移植之ARM中断原理, 中断嵌套的误区,中断号的怎么来的
- 匿名方法[2]
- C#跨线程调用窗体控件
- C++中关于文字编码的问题
- 7个信号表示你面试成功(转自人人校招)
- C++回顾一
- CAS原理
- C#把字符串转为控件ID
- call_user_func函数和call_user_func_array函数
- 【互动出版网】2013双11全场科技图书六折包邮
- HTTP协议分析
- oracle存储过程之数据增删查改及调用