出处:https://blog.qt.io/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/

但是注意,这只是QT运行(RunTime)过程中采用的编码,并不代表源码文件里也是这样的。恰恰相反,源码文件必须是UTF8,带不带BOM都可以。我认为,虽然存储在源代码里的中文字是UTF8,但是QT在编译过程中,遇到中文会立即转换成UTF-16从而对源码里的中文字符进行编码,并存储在EXE文件里(这里对编译器来说,都是静态字符,必须选择一个合适的编码存储在EXE文件里),这是我自己的理解的,不一定完全正确。

由于VS系列编译器自作聪明的帮你做转换,因此源代码里的:

QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")

是不能正确运行的。

但是以上代码却可以在MINGW编译器下运行(经过实际验证),原因是它不会自作聪明帮你做转换。

具体参考:http://blog.csdn.net/dbzhang800/article/details/7325698

-----------------------------------------------------------------------------------

总结:所谓编码一共有这几种不同情况:
1. 源码文件的格式,不同编译器有不同的要求。有些编译器随遇而安使用ANSI,有些要求必须是UTF8否则后果自负,有些能自动识别和区别两者而且还能混合使用。
2. 编译器处理源码文件时可能自动转换编码,造成与期望结果不匹配,或者根据你设置的环境参数设置编码进行处理(VS项目里就有一个编码设置,我还没搞懂)
3. 程序运行时(RunTime)又有一个编码,而且可动态改变。就QT5来说,它的String是UTF16,但其源代码文件存储格式一定是UTF8,字符初次读入或者转换的时候并且还受QTextCodec::codecForName的影响,这样同在QT下就有了3种不同情况下的编码。
4. 手写代码从文本文件读入数据时,通常又有默认字符编码,要小心
5. 有了正确运行/存储的数据,发送Server端时候字符时候又有可能一个编码,而且有可能会被自动转换,要千万小心,比如mysql的传输编码与存储编码就可以是不同的。
6. 接受字符时(还不是接受后存储,仅指从客户端接收数据到内存中,接受过程中即使不写任何转换代码、受环境影响也有可能已经存在自动转换编码的问题),又有编码,需要正确设置。特别注意,发送和接受经常受服务器软件自动设置的影响,不是你发了UTF8编码、发出去的就是UTF8编码,更不用说接受。
7. 存储数据的时候,又有编码格式
8. 调试窗口(比如Console)也有自己的编码格式,调试时显示不正确,不代表运行数据不正确,也不代表最终用户界面的数据不正确。反之也是这样,调试正确,不代表最终数据的编码一定正确。
我用VS调试的时候,发生过左右两个调试窗口,一个正确显示,另一个错误显示的情况,差点让我昏倒。
9. 最终用户的显示又有自己的显示编码。我就遇到过调试窗口编码错误,最终GUI界面显示正确,当时也是差点昏倒,而且编程要以这个为准。
10. 如果要与浏览器打交道,又多一层编码的问题,但原理与上面相同。

QString内部仍采用UTF-16存储数据且不会改变(一共10种不同情况下的编码)的更多相关文章

  1. teradata 字符串数据合并 在concat()函数无法使用的情况下

    在teradata sql中不存在concat()函数或者stuff()函数,在此情况下,如何实现多条字符串数据合并成一行? 在查找不同方法过程中,在stackflow中找到最简便的方法,使用xml_ ...

  2. 65*24=1560<2175 对数据的统计支撑决策假设 历史数据正确的情况下,去安排今后的任务

    没有达到目标,原因不是时间投入不够,而是不用数据决策,不用数据调度定时脚本 [数据源情况统计]----># 近30天,日生效coin数目SELECT COUNT(DISTINCT coin) A ...

  3. 使用数据泵,在不知道sys用户密码的情况下导出导入

    expdp \"/as sysdba\" directory=my_dir logfile=expdp.log dumpfile=expdp_scott.dmp schemas=s ...

  4. QString够绕的,分为存储(编译器)和解码(运行期),还有VS编译器的自作主张,还有QT5的变化

    多读几篇,每篇取几句精华加深我对QString的理解. ------------------------------------------------------------------ QStri ...

  5. [ Android 五种数据存储方式之三 ] —— SQLite存储数据

    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...

  6. 使用mongoVUE删除大量数据的情况下失效问题

    昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问 ...

  7. 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)

    https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...

  8. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  9. android开发之存储数据

    android数据存储之SharedPreferences 一:SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配 ...

随机推荐

  1. SQL访问EXCEL错误集合

    --行集函数 --1, OPENDATASOURCE 环境:WIN7,SQL 2014,OFFICE 2013 SELECT * FROM OPENDATASOURCE('Microsoft.ACE. ...

  2. effective c++(05)(06)之c++默默编写并调用的函数

    1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...

  3. 复制pdf文字出来是乱码的一种可能的解决方案

    最近在处理一个pdf文件,是一个地图文件,上面带各种文字的标注,地图比较大,而且文字信息比较多而且分散.因为字体的问题,在我的windows电脑上虽然可以正常显示,但是复制出来的文字都是方块,而且对应 ...

  4. (一)问候Spring4

    第一节:Spring 简介 Spring 作者:Rod Johnson: 官方网站:http://spring.io/ 最新开发包及文档下载地址:http://repo.springsource.or ...

  5. JavaScript学习笔记(3)——JavaScript与HTML的组合方式

    一.JavaScript可以写在HTML页面内部, 可位于 HTML 的 <body> 或 <head> 部分中,或者同时存在于两个部分中. 通常的做法是把函数放入 <h ...

  6. OpenJudge 2739 计算对数

    1.链接地址: http://bailian.openjudge.cn/practice/2739/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 给定两个正整数a和b.可 ...

  7. TreeSet集合

    TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...

  8. CAS原理

    JDK5之前Java是靠synchronized关键字保证同步,这种机制存在以下问题: 在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题 一个线程持有锁会导致其他需要此锁的 ...

  9. 软件测试之 LoadRunner安装\破解\汉化

    一.下载 LoadRunner下载地址:http://kuai.xunlei.com/d/QRNIUASALOIE 二. 安装 1.启动安装程序 运行setup.exe,点击“LoadRunner完整 ...

  10. 鸟哥笔记:linux系统日志文件介绍

    简单的说日志文件就是记录系统活动信息的几个文件,例如:何时.何地(来源ip).何人(什么服务名称).做了什么操作.换句话说就是:记录系统在什么时候由哪个进程做了什么样的行为时,发生了什么事件等. 日志 ...