首先说明下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 API

QTCreator默认采用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-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解码成功,输出"印象笔记"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. (Unicode characters 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_t on Visual 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.

QTCreator中字符编码问题以及WINDOWS API A/W两种版本的说明相关推荐

  1. 如何修改wampserver中mysql中字符编码的解决方案

    如何修改wampserver中mysql中字符编码的解决方案 参考文章: (1)如何修改wampserver中mysql中字符编码的解决方案 (2)https://www.cnblogs.com/wa ...

  2. c语言中大写英文字母所占字节,Java中字符编码和字符串所占字节数 .

    首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...

  3. Word 2003中打开最近操作过的文档的两种推荐的方法

    本文介绍Word 2003中打开最近操作过的文档的两种推荐的方法. 注:我的系统为WINDOWS 7,与XP下基本一致. 方法1: 在WINDOWS 7下,点击任务栏上的WINDOWS图标(即&quo ...

  4. 基于ArcGIS JS API实现的两种距离和面积测量方式

    文章目录 前言 开发思路 主要代码 效果测试 效果图 测试页面 开发总结 参考链接 前言 在一些地图地图应用中,距离.面积测量属于基础功能.ArcGIS API for JavaScript有单独提供 ...

  5. Windows启动MYSQL的两种方式

    文章目录 Windows启动MYSQL的两种方式 方式一:通过程序关闭启动 方式二:DOS命令方式启动(以管理员身份运行DOS窗口) Windows启动MYSQL的两种方式 方式一:通过程序关闭启动 ...

  6. WINDOWS XP完全安装极度第五版(两种版本供选择)配图

    WINDOWS XP完全安装极度第五版(两种版本供选择)配图 图片: 图片: 图片: 隆重推出WINDOWS XP完全安装极度第五版(两种版供选择)技术支持电话:13509588628 由于无法上传图 ...

  7. android 设置字体大小和不同颜色,Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果...

    Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 android:id="@+id/uppaid_time" android:layout_ ...

  8. 会员营销体系中,保持企业会员营销持久有效的两种手段

    在会员营销体系中,企业最关心的问题是什么呢?可能很多企业都没有去深究这个问题,其实很简单,开展企业会员营销的目的是为了提升用户的粘性,让用户在企业这里更好的留存,只要用户留存下来,那么企业就可以获取到 ...

  9. html点击空白处关闭,vue中实现点击空白区域关闭弹窗的两种方法

    1. 第一种做法 首页在外层容器里面取一个名字为main,即ref="main",当bankSwitch为true的时候,弹窗出现 你好我是弹窗里面的内容部分 所触发的事件如下: ...

最新文章

  1. elasticsearch查询及logstash简介
  2. 安装mysql出现错误_安装Mysql时出现错误及解决办法
  3. Windows Store App 获取文件及文件夹列表
  4. 使用git恢复未提交的误删数据
  5. hdoj_1711_Number Sequence
  6. 如何计算给定一个unigram语言模型_数位语音处理Lesson3-初识前端信号处理、语言模型...
  7. 【图像去噪】基于matlab邻域的自适应小波阈值图像去噪【含Matlab源码 1188期】
  8. autocad型源代码_AutoCAD文件格式详解
  9. python django 下载多个文件,接收多个文件
  10. linux phpstudy卸载,linux 安装phpstudy
  11. 个人任务五——事后诸葛亮项目回顾
  12. 银行业智能运维的探索与实践
  13. Python 游戏开发: 外星人入侵
  14. 史上20大计算机病毒
  15. Android车载性能自动化测试Case设计
  16. 【编译原理】 实验二:词法分析器的手动实现(基于状态机的词法分析器)
  17. iass、pass、saas
  18. 适用于hips ui的iPhoneX及以上适配方案
  19. jsoup填充内容然后html转word
  20. 什么是human synapsin promoter?

热门文章

  1. java调用tuxedo中间件,BEA-TUXEDO中间件介绍.ppt
  2. C++面试题-面向对象-静态成员变量以及静态成员函数
  3. C++传递数组给函数
  4. C语言以字符形式读写文件
  5. css3新属性partA
  6. liunx 双网卡同网段配置
  7. 23. WebVR播放器: 消费升级带来的机遇
  8. Leetcode#102Binary Tree Level Order Traversal
  9. 20个令人称赞的以办公环境为背景的网站作品
  10. [ACM_数学] Fibonacci Nim(另类取石子,2-4组合游戏)