c传字符串给python_ESL python调用C模块时传递unicode字符串报错问题解决

在使用freeswitch时,通过ESL的Python接口传递字符串遇到TypeError,原因是Python传递的字符串为Unicode而C语言使用ASCII。通过修改SWIG的esl_wrap.cpp文件,增加Unicode检查并进行转换,确保C语言接收到正确的字符编码。完成修改后编译freeswitch的esl库。
摘要由CSDN通过智能技术生成

在是用freeswitch时利用ESL的python调用时传递字符串报错

TypeError:inmethod 'ESLconnection_api',argument 2of type 'char const *'

是由于python传递的字符串为unicode,在c语言char使用的ascii码方式

在SWIG中做一下转换,代码如下

修改文件esl_wrap.cpp

#####

/* for C or C++ function pointers */

//添加定义

#define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(ptr, type, flags)

SWIGINTERN int

SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)

{

//增加Unicode检查

if (PyUnicode_Check(obj)||PyString_Check(obj)) {

char *cstr; Py_ssize_t len;

PyString_AsStringAndSize(obj, &cstr, &len);

if (cptr) {

if (alloc) {

/*

In python the user should not be able to modify the inner

string representation. To warranty that, if you define

SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string

buffer is always returned.

The default behavior is just to return the pointer value,

so, be careful.

*/

#if defined(SWIG_PYTHON_SAFE_CSTRINGS)

if (*alloc != SWIG_OLDOBJ)

#else

if (*alloc == SWIG_NEWOBJ)

#endif

{

*cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));

*alloc = SWIG_NEWOBJ;

}

else {

*cptr = cstr;

*alloc = SWIG_OLDOBJ;

}

} else {

*cptr = PyString_AsString(obj);

}

}

if (psize) *psize = len + 1;

return SWIG_OK;

} else {

swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();

if (pchar_descriptor) {

void* vptr = 0;

if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {

if (cptr) *cptr = (char *) vptr;

if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;

if (alloc) *alloc = SWIG_OLDOBJ;

return SWIG_OK;

}

}

}

return SWIG_TypeError;

}

//定义UTF8转换函数

SWIGINTERNINLINE PyObject *

SWIG_FromUTF8CharPtrAndSize(const char* carray, size_t size)

{

if (carray) {

if (size > INT_MAX) {

swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();

return pchar_descriptor ?

SWIG_InternalNewPointerObj(const_cast< char * >(carray),pchar_descriptor, 0) : SWIG_Py_Void();

} else {

const unsigned char *ucp = (const unsigned char *)carray;

size_t i;

for (i = 0; i < size; ++i) {

if (ucp[i] >= 0x80) /* UTF-8? */

return PyUnicode_FromStringAndSize(carray, static_cast< int >(size));

}

return PyString_FromStringAndSize(carray, static_cast< int >(size));

}

} else {

return SWIG_Py_Void();

}

}

SWIGINTERNINLINE PyObject *

SWIG_FromCharPtr(const char *cptr)

{

//return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));

//调用转换

return SWIG_FromUTF8CharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));

}

完成后编译即可

freeswitch/libs/esl

make pymod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值