QString内部仍采用UTF-16存储数据且不会改变(一共9种不同情况下的编码)

出处: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. 如果要与浏览器打交道,又多一层编码的问题,但原理与上面相同。

时间: 2024-10-12 22:57:04

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

并发下,使用redis防止数据重复插入(数据库未对表字段设置唯一情况下)

@Controller @RequestMapping("/myTest") public class TestController {     @Autowired(required = false)     private TestService testService;          @Autowired     private RedisUtil redisUtil;     @RequestMapping("add")     public void 

[安卓基础]010. 存储数据(上)

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

Android存储数据方式(转)

转自http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html   本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种: 使用Sha

16 MySQL数据导入导出方法与工具介绍之一

1).mysqlimport的语法介绍:mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具.这是一个命令行工具.有两个参数以及大量的选项可供选择.这个工具把一个文本文件(text file)导入到你指定的数据库和表中.比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表Custermers中:mysqlimport Meet_A_Geek Customers.txt注意:这里Customers.

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

昨天有一个系统出现了问题,导致半夜时大量的错误数据产生,早晨一早接到上边通知让把这些数据尽数删除. 不可否认在数据操作时mongoVUE更加直观,因此一般情况下我也都是使用这个工具,但是今天却出现了问题. 首先我查询了一下需要删除的数据的数据量,查询操作正常,如图: 然后一样的条件执行删除remove操作,结果就卡在那里许久之后弹出错误提示框如下: 几次尝试后均是如此,于是我只好改道使用系统中的命令行进入mongo shell中执行操作删除,这些数据终被删除,如图: 由此可见,熟悉命令行操作还是

企业采用云存储数据之前需做足准备

昂贵的硬件设备,不菲的制冷设施,再加上人员维护费用,处处都是用钱才能 堆砌出来的数据中心.这庞大的数字都预示着建立自己的数据中心是一项多么具有挑战的任务,且不说环保问题.所以企业建立自己的数据中心以达到存储数据的目 的,要付出昂贵的代价.在这种情况下,云存储的出现,就好似数据存储界的救世主降临一般,帮助企业利用零碎的成本进行数据存储,而且越来越受欢迎. 但是,也不能盲目地把数据全部迁移到云中存储,在决定采用云存储数据之前企业还是有一些准备工作要做的: 1.确保云厂商数据中心实时更新,并有行业认证

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU).只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU. 出现的问题: 1)         这种多对一的服务器向客

[安卓基础] 012.存储数据(下)——文件存储

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

使用jQuery的data方法来为页面中的某个元素存储数据,(获取焦点,清除默认值)

使用data方法可以避免在DOM中存储数据,有些前端开发er喜欢使用HTML的属性来存储数据: 使用”alt”属性来作为参数名存储数据其实对于HTML来说是不符合语义的. 我们可以使用jQuery的data方法来为页面中的某个元素存储数据: html部分: 1 <form id="testform"> 2 <input type="text" class="clear" value="Always cleared&qu