Python: 将unicode字符串传递给C++模块
我现在正在使用一个现有的模块,这个模块提供了一个C++的接口,并且可以对字符串进行一些操作。
我需要使用Unicode字符串,但这个模块不支持Unicode接口,所以我写了一个额外的函数来添加到接口中:
void SomeUnicodeFunction(const wchar_t* string)
但是,当我尝试在Python中使用以下代码时:
SomeModule.SomeUnicodeFunction(ctypes.c_wchar_p(unicode_string))
我遇到了这个错误:
ArgumentError: Python argument types in
SomeModule.SomeUnicodeFunction(SomeModule, c_wchar_p)
did not match C++ signature:
SomeUnicodeFunction(... {lvalue}, wchar_t const*)
(名字已经更改过了)。
我尝试把C++模块中的wchar_t改成Py_UNICODE,但没有成功。我该怎么解决这个问题呢?
2 个回答
2
我找到了一种方法来解决这个问题:
SomeModule.SomeUnicodeFunction(str(s.encode('utf-8')))
到目前为止,这个方法对我来说效果很好。
更新:其实,使用UTF-8编码让我不需要用到SomeUnicodeFunction,而可以直接使用标准的SomeFunction,这样就不用特别处理unicode了。我想每天都有新发现 :).
2
在Linux系统上,你不需要修改你的API,只需这样做:
SomeModule.SomeFunction(str(s.encode('utf-8')))
在Windows系统上,所有的Unicode API都使用UTF-16小端格式(Little Endian),所以你需要按照这种方式进行编码:
SomeModule.SomeFunctionW(str(s.encode('utf-16-le')))
值得注意:wchar_t在不同的平台上可能有不同的大小:8位、16位或32位。