kchmviewer4中文路径bug的解决

2009-05-23 20:02:36
趁昨天才改完kchmviewer4的index显示bug,对kchmviewer的代码结构还记得比较清楚,今天把kchmviewer4中文路径的bug也给解决了。
问题解决方法如下:
在源码目录下找到kchmmainwindow.cpp下找到parseCmdLineArgs()函数,找到如下行:
filename = args->arg(0); (在文件的520行)
和
filename = qApp->argv()[i];  (在文件的547行)
分别改为:
filename = QString::fromLocal8Bit(args->arg(0));
和
filename = QString::fromLocal8Bit(qApp->argv()[i]);
然后保存编译,大功告成!

问题分析:
这个问题其实很简单,在程序启动时会先检查有没有附加参数,如果有,那么程序就会打开相应的文件。中文路径出错就是在这时发生的。
可以从代码中看到,程序文件的代码如下:
if ( !loadFile( QString::fromLocal8Bit(qPrintable(filename) ) ) ) (在kchmmainwindow.cpp的553行)
从这行代码的意图我们可以看出载入chm文件的函数loadfile实际上是需要一个unicode编码的字符串,而实际传入的参数是QString::fromLocal8Bit(qPrintable(filename) ) ,估计这是程序作者一时写的头昏了没注意,qPrintable() 的作用是把unicode的字符串转换成本机所使用的8位字节码,而QString::fromLocal8Bit的作用是把本机所使用的8位字节码转换成unicode。
所以总的来说QString::fromLocal8Bit(qPrintable(filename) ) 所做的事情就是把本来为unicode的filename转换为本机所使用的8位字节码再转回成unicode,实际上毫无意义!并且在这里的前提条件就出了错,实际上filename此时根本就不是unicode编码的,从前面的代码来看(filename = qApp->argv()[i];)filename此时使用的本机使用的8位字节码,这就是出错的根源所在了!