python unicode转string_清洁方式将Python 3 Unicode转换为std :: string

I wrap a lot of C++ using the Python 2 API (I can't use things like swig or boost.python for various technical reasons). When I have to pass a string (usually a path, always ASCII) into C/C++, I use something like this:

std::string file_name = PyString_AsString(py_file_name);

if (PyErr_Occurred()) return NULL;

Now I'm considering updating to Python 3, where PyString_* methods don't exist. I found one solution that says I should do something like this:

PyObject* bytes = PyUnicode_AsUTF8String(py_file_name);

std::string file_name = PyBytes_AsString(bytes);

if (PyErr_Occurred()) return NULL;

Py_DECREF(bytes);

However this is twice as many lines and seems a bit ugly (not to mention that it could introduce a memory leak if I forget the last line).

The other option is to redefine the python functions to operate on bytes objects, and to call them like this

def some_function(path_name):

_some_function(path_name.encode('utf8'))

This isn't terrible, but it does require a python-side wrapper for each function.

Is there some cleaner way to deal with this?

解决方案

Looks like the solution exists in python 3.3, with char* PyUnicode_AsUTF8(PyObject* unicode). This should be exactly the same behavior as the PyString_AsString() function from python 2.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值