网页收藏小工具(四)-- mfc&python

来源:互联网 发布:java后端技术栈 编辑:程序博客网 时间:2024/06/05 09:00

今天又奋战了一天,软件已经成形了,还有个别细节需要再优化下,下面我说说在开发过程中mfc&python的一些“恩怨是非”吧

c++和python的结合相信大家肯定都是从Python.h这个头文件开始的,但是有时候联合两种语言并不是简单地包含头文件,在除了设置包含python的include文件夹及libs文件夹路径外,如果你的vs处于调试模式,而恰恰你下载的又是python的release版本,那么问题就来了,编译器肯定会报错如下 :

无法解析的外部符号*****

无法解析的外部符号*****

....

看了确实让人头疼,后来意外在pyconfig.h中发现这样的一段代码:

#ifdef _DEBUG#pragma comment(lib,"python27_d.lib")#else#pragma comment(lib,"python27.lib")#endif /* _DEBUG */
被坑了不是,所以果断包含python.h头文件处理如下,当然如果你是RELEASE模式就没有必要了

#ifdef _DEBUG #undef _DEBUG #include <Python.h> #define _DEBUG#else #include <Python.h>#endif
哈哈,这样好使了,好吧,这只是迈出的第一步,事实证明下面的路真的很长,这不,到现在才开始发帖!!


软件的三种大小的界面图如上,《收起/展开》键主要是切换界面的大小,收藏与检索无需多说,在搜索完对应关键字的文件后,双击某文件即可以默认浏览器打开本地网页文件了。

关于python如何在mfc中初始化、加载模块、运行功能函数我也没什么好说的,毕竟不是自己写的,而且网上资料也是一大把的,下面主要聊聊在这过程中遇到的最大的两个问题:1:宽字节与多字节的转换问题 2:字符编码问题

在mfc开发环境中,如果在工程中配置了Unicode字符集,那好了,有的你受的了,当然如果你能在程序中彻头彻尾地用CString这个神器,那你就太幸福了,但是有时候却不得不用到多字节的字符串,那么就要涉及到二者的转换,在多字节字符串转双字节中,对于常量字符串我们用_T();便可以了,但是对于字符串变量却是不行的,网上也是很多介绍转换方法的但却没有一个好用,最后还是选择了万能的MultiByteToWideChar,在宽字节字符串转多字节中,用CStringA字符串转换我试过是好使的,这个我不太懂,希望懂的朋友回复解释,谢谢!但还是用了WideCharToMultiByte函数,不管怎样有了这两个神器还是不错的,自己是个初学者,也建议其他初学者可以好好学习下这两个函数,为今后的开发提高效率

第二个问题便是在python下的字符编码问题,也是让我纠结了一晚上,先把最终的打开网页的代码贴下:

def openhtml(lis):    import webbrowser    path = "C:\\Users\\LuXu\\Desktop\\savehtml\\正式版v1.1\\Keytosave\\Python27\\htmlfiles\\"    filename = path.decode('utf8').encode('gbk') + lis    webbrowser.open_new_tab(filename)return
其实在这段简洁的代码之前已经经历过了“无数”次的尝试了,但是问题总是因为字符编码问题无法正常工作,为了避免在字符串传参过程中带来的不必要麻烦,故最终在c++中将openhtml的调用参数简化,使用如下形式
PyTuple_SetItem(pArgs3, 0, PyList_GET_ITEM(pFilesresult,nSel));
其中pFilesresult是<检索>后python返回的文件名列表,而nsel则是当前用用户双击的文件索引,这样PyList_GET_ITEM得到的便是用户双击的文件名字符串,这样感觉就保存了字符串的原始编码方式,而事实也证明了这一点,然而往往当你认为解决问题豁然开朗时,事实总会狠狠地扇你一巴掌,你却一脸无辜,没法给自己的错误安个理由,就是这样的代码
    path = "C:\\Users\\LuXu\\Desktop\\savehtml\\正式版v1.1\\Keytosave\\Python27\\htmlfiles\\"    filename = path + lis
最终的结果是用IE打开了www.duba.com网页,我了个去,八竿子打不着啊,最终无奈,print 了下filename结果是这样的:
C:\Users\LuXu\Desktop\savehtml\姝e紡鐗坴1.1\Keytosave\Python27\htmlfiles\python os模块学习(一) - py&amp;禅 - 博客园.html
很明显path与lis的编码方式不一样,主要是中文字符出了问题,对比了下中文字符,
姝e紡鐗坴 即 正式版 编码是 \xe6\xad\xa3\xe5\xbc\x8f\xe7\x89\x88
模块学习 即 模块学习 编码是 \xc4\xa3\xbf\xe9\xd1\xa7\xcf\xb0
网上说utf8是三字节表示一个汉字的,那么正式版应该就是utf8,如果尝试先decode('utf8')然后encode('gbk'),不知道是不是表示编码成两字节表示一个汉字。至于字符这块,会后续发贴。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ps文件说数据似乎已经损坏怎么办 百度云中的压缩包下载的很慢怎么办 游戏压缩出现未知错误或损坏怎么办 百度云里的压缩包解压后损坏怎么办 联创打印时显示压缩文件失败怎么办 电脑的软件打开出现未知格式怎么办 图片只突出人物边上全黑怎么办 合金机兵存档密码忘了怎么办 手机网页验证码无法加载插件怎么办 绝地求生次激战场机型不支持怎么办 木茷生存中文版安装包损坏了怎么办 手机下载软件显示安装包损坏怎么办 不小心把qq图片删了怎么办 奶水不足宝宝不好好吸奶怎么办 膀胱切除前列腺切除阴茎不硬怎么办 小孩的睾丸睾丸碰肿了怎么办 怎么判断小孩子的睾丸没下来怎么办 怀孕39周腰酸屁股酸疼该怎么办 我儿子18岁睾丸筋鼓起来怎么办 去医院检查说精子跑的慢怎么办 多囊卵巢综合症引起屁股增大怎么办 蚊子咬了肿了挠破了流水怎么办 血糖高引发的睾丸一直烂怎么办? 被洪水淹过的猪后期怎么办 做睾丸阴囊彩超阴茎突然勃起怎么办 阴茎冠状沟皮肤感染总不愈合怎么办 不小心咬到孩子破皮了怎么办 小孩子不小心碰到脸黑了一块怎么办 眼睛不小心碰到了里面红了怎么办 八个月宝宝睾丸还沒掉下来怎么办 孩子背部皮肤有一块皮肤很脏怎么办 洗浴种心搓背老板不给发工资怎么办 半个月小鸡屁骨下垂眼睛紧闭怎么办 在学校走廊把老师撞倒了怎么办 裤衩给孩子买的有点肥怎么办 到交警队立案后医疗费没了怎么办 交警扣车车里的贵重东西没了怎么办 睾丸内囊肿割了又长怎么办 我把别人的卵子踢碎了怎么办 两岁宝宝不小心被猫抓出血怎么办 两岁宝宝小蛋蛋肿了怎么办