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

摘要:
这只是QT运行时使用的编码。当遇到中文时,它将立即转换为UTF-16,以编码源代码中的汉字。必须选择适当的编码并将其存储在EXE文件中。2.编译器可以在处理源代码文件时自动转换编码。或者您可以根据您设置的环境参数设置代码(VS项目中有一个代码设置,我仍然不理解)。

出处: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种不同情况下的编码)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇layer 弹出框 回传事件获取弹出框的一些属性Android深入浅出之 AudioTrack分析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

wxWidgets刚開始学习的人导引(2)——下载、安装wxWidgets

wxWidgets刚開始学习的人导引全目录   PDF版及附件下载 1 前言2 下载、安装wxWidgets3 wxWidgets应用程序初体验4 wxWidgets学习资料及利用方法指导5 用wxSmith进行可视化设计附:学习材料清单 2 下载、安装wxWidgets   这方面的资料从网络能够找到不少。wxWidgets的文档,要涵盖各种操...

Mac使用nginx+rtmp服务器

一、安装Homebrow 已经安装了brow的可以直接跳过这一步。执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 如果已经安装过,而想要卸载: ruby -e "$(curl -fsSL https://raw.gi...

Linux 系统的日志目录

连接时间的日志 连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,通过who查看 who /var/log/wtmp 【连接时间日志】 who /var/log/utmp 【连接时间日志】 ac -p //查看每个用户的连接时间 ac -a //查看所有用户的连...

udev简述

udev 是 Linux 内核的设备管理器。总的来说,它取代了devfs和hotplug,负责管理/dev中的设备节点。同时,udev 也处理所有用户空间发生的硬件添加、删除事件,以及某些特定设备所需的固件加载。 udev是systemd的组成部分,默认已安装,有关信息可查阅systemd-udevd.service的手册页。 udev和devfs比较 1...

cordova热更新

全局安装cordova npm install –g cordova 全局安装热更新cli npm install -g cordova-hot-code-push-cli android热更新步骤 创建cordova项目 Cordova create cordova-hot-push 安装热更新插件 cordova plugin add cordova-...

shell脚本(3)-格式化输出

一个程序需要有0个或以上的输入,一个或更多输出 一、echo语法 1、功能:将内容输出到默认显示设备。 echo命令功能在显示器上显示一段文字,一般提到提示的作用 2、语法:echo[-ne][字符串] 补充说明:echo会将输入的字符串送往标准输出,输出的字符串以空白字符隔开,并在最后加上换行号。 命令选项: -n:不在最后自动换行: [root@loc...