QTCreator中字符编码问题以及WINDOWS API A/W两种版本的说明
2017-03-25 08:59
435 查看
首先说明下windows中API有两种结尾的一种以A结尾一种以W结尾, A代表ANSI编码,W代表UTF-16编码, 这里承清下unicode不是编码方式, 而是字符集.ANSI编码对于不同的国家和地区制定了不同的编码方式,GB2312(简体中文),BIG5(繁体中文),JIS(日文),在简体中文系统下,ansi 编码代表 GB2312 编码,在日文操作系统下,ansi 编码代表 JIS 编码。这里以简体中文的GB2312为例, 它是用两个字节对汉字进行编码的。用ANSI的好处在于节约空间,但是坏处在于各地不兼容UTF-16呢实际上是用1个或者2个16位来进行编码来统一所有字符UTF-8呢,是用1到4个的8位字符来表示,它也是可变, 英文用7位的ASCII码就可以表示, 拉丁文用8位的Latin1编码就可以表示(表注音),如果有大量的这样的字符,用ANSI或者UTF-16就浪费了空间,因为用一个字节就可以表示了,因为可变长的UTF-8来了,对拉丁文1个字节,对于复杂的用2个甚至4个字节来表示,它有具体的机制来区分到底几个字节表示一个字符。这个机制我就不讲,细节问题。好了, 关于字符集以及其编码我们先介绍的到这里, 感兴趣的可以参考下面的资料 http://blog.sina.com.cn/s/blog_a547eff001012igt.html http://blog.csdn.net/lvxiangan/article/details/8151670 接着我讲下QTCreator里字符编码的运用,首先要在QTCreator里面调用WINDOWS的API在.pro文件中加入
LIBS += -luser32 # for using Windows APIQTCreator默认采用unicode字符集, 如果想去掉在.pro文件中加入
DEFINES -= UNICODE好了,下面来看我们程序在QtCreator的Editor里面我们可以看到Default encoding 是UTF-8, 好下面我们开始实验我们先看多字符集也就是加入了 “DEFINES -= UNICODE”的情况
QByteArray encodedString = "印象笔记"; qDebug() << encodedString;//输出"\xE5\x8D\xB0\xE8\xB1\xA1\xE7\xAC\x94\xE8\xAE\xB0", UTF-8编码 QString string("印象笔记");//UTF-16编码 qDebug() << string;//UTF-16解码成功,输出"印象笔记", QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QString string1 = codec->toUnicode(encodedString);//从UTF-8到UTF-16 qDebug() << string1;//UTF-16解码成功,输出"印象笔记" qDebug() << string1.toUtf8() ;//输出"\xE5\x8D\xB0\xE8\xB1\xA1\xE7\xAC\x94\xE8\xAE\xB0", UTF-8编码 qDebug() << string1.toLocal8Bit() ;//输出"\xD3\xA1\xCF\xF3\xB1\xCA\xBC\xC7", ANSI编码(GB2312) qDebug() << string1.toStdString().c_str() ;//UTF-8解码成功,输出"印象笔记" qDebug() << string1.toLatin1() ;//"????" m_hGame = FindWindow(NULL, string1.toLocal8Bit());//只有这种编码成功,其余都失败(这里API函数为A版本) qDebug() << m_hGame;先看下QT中关于QString的官方文档The QString class provides a Unicode character string.QString stores a string of 16-bit QChars,where each QChar corresponds one Unicode 4.0 character. (Unicodecharacters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)这里QString的编码方式理解为UTF-16放在内存中结论就是A类API函数需要ANSI编码下面去掉“DEFINES -= UNICODE”再来看看QByteArray encodedString = "印象笔记";qDebug() << encodedString;//输出"\xE5\x8D\xB0\xE8\xB1\xA1\xE7\xAC\x94\xE8\xAE\xB0", UTF-8编码QString string("印象笔记");//UTF-16编码qDebug() << string;//UTF-16解码成功,输出"印象笔记",QTextCodec *codec = QTextCodec::codecForName("UTF-8");QString string1 = codec->toUnicode(encodedString);//从UTF-8到UTF-16qDebug() << string1;//UTF-16解码成功,输出"印象笔记"qDebug() << string1.toUtf8() ;//输出"\xE5\x8D\xB0\xE8\xB1\xA1\xE7\xAC\x94\xE8\xAE\xB0", UTF-8编码qDebug() << string1.toLocal8Bit() ;//输出"\xD3\xA1\xCF\xF3\xB1\xCA\xBC\xC7", ANSI编码(GB2312)qDebug() << string1.toStdString().c_str() ;//UTF-8解码成功,输出"印象笔记",std::string QString::toStdString() const Returns a std::string object with the data contained in this QString. The Unicode data is converted into 8-bit characters using the toUtf8() function./* inline QDebug &operator<<(const char* t) { stream->ts << QString::fromUtf8(t); return maybeSpace(); }*/qDebug() << string1.toStdWString().c_str() ;//0x139470, 返回wchar_t*, typedef unsigned short wchar_t;按unsigned short来解释地址指向的值/*The std::wstring is encoded in utf16 on platforms where wchar_t is 2 bytes wide(e.g. windows) and in ucs4 on platforms where wchar_t is 4 bytes wide (most Unix systems).*/qDebug() << string1.toLatin1() ;//"????"m_hGame = FindWindow(NULL, string1.toStdWString().c_str());//只有这种编码成功,其余都失败(这里API函数为W版本)qDebug() << m_hGame;
WCHAR(or
wchar_tonVisual C++ compiler) is used for Unicode UTF-16 strings on windows. on Linux and Mac it's UTF-32
CHAR(or
char)can be used for several other string formats: ANSI, MBCS, UTF-8.(关于它们定义 见http://www.firstobject.com/dn_markansifile.htm, 我觉得ANSI和UTF-16对应和MBCS应该和UNICODE对应)(http://stackoverflow.com/questions/23136837/in-c-when-to-use-wchar-and-when-to-use-char)结论就是W类API函数需要UTF-16编码大概总结下, Qstring里面用UTF-16,转成std::string时用的UTF-8编码,转成std::wstring依靠平台,windows上是UTF-16 当用qdebug输出wchar*时,由于wchar定义为unsigned short,所以其指针指向的单元被解释为unsigned short.
相关文章推荐
- Windows下的Android SDK下载,2.2之前各个版本及Google API,文档说明等
- Python - Appuim 2. 常用API 以及 selenium 版本更新引发的问题
- Windows下的Android SDK下载,2.2之前各个版本及Google API,文档说明等
- Tomcat版本问题,以及servlet-api.jar,jsp-api.jar去除
- Win10下python3和python2同时安装并解决pip共存问题 特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似。 使用python开
- charles抓包的安装,使用说明以及常见问题解决(windows)
- 解决在Windows 2003的 IIS 6.0 中无法上传超过200K的附件以及无法下载超过4M的附件问题
- 字符串中的字串问题,两种算法了解。以及自己这两天看到的些东西的总结
- 装完Windows Media Player 11后PPlive不能播放,以及Windows Media Player 11不能卸载的问题
- 在C#里怎样获得当前Windows操作系统的语言种类?以及如何知道当前Windows版本?
- QT 4.5 windows版本 安装问题 及 Junction 使用
- Java笔记(三)--不同版本jdk以及tomcat共存的问题
- VS2008下使用MFC,做托盘以及气泡提示,shellapi.h的问题。。
- 解决在Windows 2003的 IIS 6.0 中无法上传超过200K的附件以及无法下载超过4M的附件问题
- EXEC的两种用法以及用动态语句创建临时表的问题
- EXEC的两种用法以及用动态语句创建临时表的问题
- windows 2003 IIS 下新建网站不能选择.net 框架版本的问题
- Windows XP style Explorer Bar使用问题说明
- Windows Live Messenger 总是提示有最新版本而无法登录的问题(562/566)
- 转 windows 环境下 mysql 数据库的升级以及 出现问题的解决 Communication link failure: Bad handshake