QT,相信使用的人很多用在跨平台上,然而要保证Windows、Linux同用一份源码,就不得不考虑源代码编码问题了,在编码发展上,我打赌未来肯定是要舍弃Ansi转向Unicode编码的,Unicode又有多种编码方式GBK(GB2312的升级版),BIG5,utf8,utf16等。
Win下默认GBK,Linux(ubuntu)默认utf8,然而QT呢?QTCreator文本编辑器默认也是utf8文件格式,BOM目前存在则保留。所以通常设置
QTextCodec *codec = QTextCodec::codecForName("utf8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
就能解决大部分问题,通常很多人犯的错误,包括我接触过的别人写的项目都是各种文件格式Ansi、utf8、gbk糅合在一个项目中(估计都是直接从网上download的代码,自己没整理就直接使用文件)。导致这里没乱码,那里有乱码,这种现象。
在某些情况下也是有问题的,因为程序可能读到系统的中文路径,或者调用中文路径下的外部程序,这时候如果系统是gb2312就有问题了。因为中文路径的编码是采用utf-8存到QString里的,系统读中文路径解码的时候采用的却是系统的gb2312,所以会调不起带中文路径的外部程序。
以上问题下面方法可以解决:
QTextCodec *codec =QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(codec);
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
对于外部字符串编码解码全部采用本地编码。
还有一种乱码叫编码乱码,比如说,源代码utf8编码,QTextCodec *codec =QTextCodec::codecForName("GBK");
就会导致乱码,反之亦然,故源代码与程序中使用必须统一,其实这一点是所有编译器都应该遵循的原则。因此,
Windows环境下,Qt Creator+VS编译器
1、如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.
2、如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式.
Linux环境下,Qt Creator+gcc,
默认是UTF-8(无BOM)编码方式,
综上:不考虑跨平台的话可以用默认设置,考虑到跨平台,建议选择UTF-8+BOM的编码方式.具体设置如下图