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位字节码,这就是出错的根源所在了!
> 阿里大盗的日记

> 我来回应