网页收藏小工具(四)-- 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&禅 - 博客园.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'),不知道是不是表示编码成两字节表示一个汉字。至于字符这块,会后续发贴。
- 网页收藏小工具(四)-- mfc&python
- 网页收藏小工具(一)--python保存网页
- 网页收藏小工具(二)--python异常处理
- 网页收藏小工具(三)--python文件检索
- 网页设计小工具
- 网页采集小工具
- Python 小工具集合
- [python] 用户名小工具
- python小工具
- Python 内置小工具
- python 小工具总结
- python小工具
- MFC文件分割小工具
- 网页调试小工具firbug
- 网页小工具(学习中国象棋)
- 一个值得收藏的小工具
- 有用的小工具收藏(1)
- python 单词翻译小工具
- C#创建https请求并使用pfx证书
- C语言输入字符串后回车再输入字符串才能录入第一个字符串
- JVM和Dalvik的区别
- JDK自带的native2ascii
- 第二周作业
- 网页收藏小工具(四)-- mfc&python
- 诡异的getchar() ————由hdu1075Tire所想到的
- 大数相加 模板
- ADB通过wifi控制机器
- mongoDB 注册成开启自启动项
- 索引的优缺点
- 100坚持行动---反思第二次受挫
- Python 'takes exactly 1 argument (2 given)' Python error
- 作业三,四题