QT读写文本文件编码设置

QT读写文本文件编码设置

一、编码知识科普
Qt常见的两种编码是:UTF-8和GBK
★UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
★GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。
★GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
★在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x800xFF范围的2个字节来表示1个中文字符。0x000x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

三、编码转换

Windows自带的记事本,无法查看UTF-8编码的文件到底有无BOM,需要使用其他文件编辑器,比如Notepad++或者SublimeText。

四、QString显示中文乱码的原因

  1. 读取文件编码类型设置错误
    Windows系统本地字符编码(Local字符集)为GBK 即ANSI(文本文档)。编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码(Local字符集),若指定UTF-8编码,而本地实际为GBK时变为乱码。
  2. 文本中存在不同的编码格式的文本
    比如存在ANSI(GBK)和UTF-8 无论通过哪一种读写都会出现乱码
    若txt文件是ansi格式 其中存在UTF-8编码的字符串 则读取这部分字符时出现乱码。
    可通过NotePad++切换编码确定那一部分是ANSI或UTF-8
    先通过ANSI(GBK) 读取所有字符串 获得UTF-8的字符串otherLineStr后进行转换、然后重新 写入UTF-8的文件中
   otherLineStr = otherLineStr.toLocal8Bit().data();

注意:当写入文件中的字符串有中文时,qt默认ANSI编码

五、设置字符读写字符集
Qt5可以设置Local字符集,GBK/UTF-8

			QTextStream stream(&readFile);
			stream.setCodec("GBK");

			QTextCodec* codec = QTextCodec::codecForName("UTF-8");
			strAll = codec->toUnicode(readFile.readAll());
			
			QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写
			QTextCodec::setCodecForLocale(codec); //全局编码设置

六、QString简介
Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8(),从文件中读取时ANSI(GBK)的文件使用fromLocal8Bit(), 将str所指的执行字符集从utf-8转码成utf-16。
由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。

https://www.cnblogs.com/sggggr/p/12797951.html

你可能感兴趣的:(QT,qt,开发语言,字符串,c++)