c++ 调用 python 函数中文返回值乱码

时间:2021-12-16 03:31:22

C++调用 python的方法就不说   网上不缺的就是这帖子  

如 :

http://www.cnblogs.com/allensun/archive/2011/02/04/1949090.html

http://www.jcwcn.com/article-30546-1.html

然而并都没什么卵用,没有确切的指出我们今天的这个问题该怎么解决。

问题:c++ 调用 python 函数中文返回值乱码

c++ 调用 python 函数中文返回值乱码

也是神奇了   我把一段utf-8 编码的字符传回c++ 程序 ,打印出来是乱码,而且这种乱码的原因是  把utf-8 编码的字符 解码成ascii码了 。so 我就把字符串各种转码,都是乱码的  。

解决:

在python 代码中 先把字符串 编码成 gbk 编码的,然后在传回c++ 程序  就不会乱码了 。我有句妈卖批不知当讲不当讲,这和ascii 乱码看起来没有关系啊啊。

我用的python 2.7 编码问题真心坑  

>>>>>>>>>>>>>>>>>>>>>>>>>>>>

python 转码方法  

Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化。编码是 unicode -> str,相反的,解码就 是 str -> unicode。

——————————————————————————

# -*- coding: utf-8 -*-      文件开头这句  指示了pytnon 代码的编码方式 

————————————————————————————

import sys  
reload(sys) 
sys.setdefaultencoding("utf-8")   

因为解码是python自动进行的,我们没有指明解码方式,python 就会使用  sys.setdefaultencoding() 指明的方式来解码

print(sys.getdefaultencoding())   //获取python 内部的编码方式  

——————————————————————————————

decode()  解码

encode()  编码  

python2 中  字符串分为 str 和 unicode 两种 

如果字符串在代码中被定义为s=u'中文',则s就是python内部编码unicode。unicode类型再解码会报错。

——————————————————————————————

c++代码中  处理 python的返回值   需要把 PyObject * 转为c++ 类型 

PyObject *res=NULL;
res=PyObject_CallObject(pFunc, pArgs);
char *a = "";


PyArg_Parse(res, "s",& a);   //方法一 

cout << a << endl;


// string b = PyString_AsString(res);  //方法二  
//      cout <<b<< endl;

PyX_AsY()  X: python 类型    Y: c++类型    类似的函数还有很多  可以将 python 类型 ——> c++类型  


————重要!!——补充!!——————


在python中编码成中文字符时  最好选"GB18030"  

..........

使用  str=a.encode("gbk")   可能在传回c++函数时无法显示数据!!!   

推测是utf-8 转gbk 时  有部分编码无法对应  导致丢失!    gbk的标准有点老了吧   哈哈  

如果有数据丢失的现象  把gbk换成 GB18030  


gbk  与 GB18030 的区别  点这里 。。