这几天做了一个对Excel进行对比操作的一个小项目,凑了点学费:)。主要涉及到的功能就是先用QT做一个简单的界面,可供选择输入为文件或文件夹,选择完成之后对输入文件的格式进行检查,然后对比已有的数据库中(很多个文件,大概一共十几万行数据)的数据,分析输入文件中数据的错误,最后将分析后的结果写到Excel文件中,在这个项目主要涉及到以下几个知识点:
1. QT中文乱码的解决
QString 是不存在中文支持问题的,很多人遇到问题,并不是本身 QString 的问题,而是没有将自己希望的字符串正确赋给QString。
“我是中文”这样写的时候,它是传统的 char 类型的窄字符串,我们需要的只不过是通过某种方式告诉QString 这四个汉字采用的那种编码。而问题一般都出在很多用户对自己当前的编码没太多概念。
在这里介绍一篇对字符编码讲解的很透彻的一篇文章:ASCII、Unicode、GBK和UTF-8字符编码的区别联系
QString的内部是使用的unicode编码,所以本质就是将所有字符转换成unicode编码即可正常显示。
所以当使用这样的代码:1
QString a = "我是中文"
其实等价于1
2const char* s = "我是中文"
QString a = s;
那么当需要从窄字符串char转成Unicode的QString字符串时,你需要告诉Qt你的这个char 是什么编码?GBK、BIG5、Latin-1.
所以关于Qt的中文乱码,Qt4和Qt5有不同的解决方案。
在Qt4中,常用的解决方案是在main.cpp加这几行代码1
2
3
4QTextCodec *codec = QTextCodec::codecForName("system");//获取系统中文编码
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
这几行代码就是告诉程序你的char* 中到底使用的是什么编码。
而在Qt5中取消了这几个函数,取而代之的是另外的解决方案。
用QTextCodec类中的转换函数1
2
3
4
5
6
7
8
9
10
11std::string utf82gbk(const QString &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName("GB18030");
return gbk->fromUnicode(inStr).data();
}
QString gbk2utf8(const std::string &inStr)
{
QTextCodec *gbk = QTextCodec::codecForName("GB18030");
return gbk->toUnicode(inStr.c_str());
}