被你标题吸引进来的,看到你的内容和标题出入比较大,简单说两句。
你文中内容似乎只是在试图解决一个问题:简体中文Windows下读取gbk编码的文本文件,Linux下读取utf8编码的文本文件。(而这个,对大家来说,其实不是问题。中文乱码的根源和难点都不在这儿)
第一:这两个只是个例子,实际上任何qt支持的编码都没问题,而且这个是codec插件做的,可以自己编写替换,所以可以做到任意编码都支持.
单单就Windows来说:
中文文本文件可以是GB18030 / Big5 / Utf8 / Utf16-be / Utf16-le / Utf32-be / Utf32-le 等编码保存的。
而Windows下的System编码是由区域和语言设置所决定的。只不过在简体中文系统下用的GBK / GB18030罢了
第二:这个文中有对立或者错误的地方么?
你后面提到的4点,基本看不懂。特别是ps3和ps4,你到底是在描述读文件,还是在描述你的源码文件呢? 感觉上,你在推荐在VS环境下使用gb2312作为源码文件,而且你没有用过其他国家和地区的Windows编译过你的代码。
第三:ps3属于tip,说明gb2312代码下,文本注释中写入中文,是安全的,而其他编码,是可能导致编译错误的.这段描述的是源代码文件.
顺便也说了不要使用这个方案:QStringLiteral("中文")(部分编码下这样的代码可能引起编译错误,而且和cpp文件本身的编码有关系,不通用,建议使用tr+qm)
第四:用哪个国家的windows编译代码根本不是问题,vs是可以手动调编码的,调了gb2312一样认.
第五:ps4是指不要使用这个方案
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
解决中文乱码问题,但是QT5却对以上函数中的两个已经不支持。
这个方案,在非中文windows下面真的会出问题,而且几乎任意非window平台都会出问题.
最后:乱码的根源是编码不一致.qt使用的是unicode,但是系统里面的文件指不定什么的.对于未知文本文件,文中解决方案是,使用iconv判断.
对于数据库里面产生的乱码,通常是两种问题
1.数据库内部做到编码转换
2.数据库内部存储的不是unicode,但是读取出来后未做转码处理
对于1 只能自求多福,除非摸清楚他怎么转的.
对于二,转个码就行了.