Python:将unicode字符串传递给C ++模块

时间:2010-09-19 01:55:33

标签: c++ python unicode module

我正在使用现有模块,提供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 个答案:

答案 0 :(得分:2)

找到解决问题的黑客:

SomeModule.SomeUnicodeFunction(str(s.encode('utf-8')))

到目前为止,我的目的似乎正常。

更新:实际上,使用UTF-8意味着我不需要SomeUnicodeFunction,并且可以使用标准的SomeFunction而无需专门用于unicode。我想每天都学到新的东西:)。

答案 1 :(得分:2)

对于Linux,您无需更改API,只需执行以下操作:

SomeModule.SomeFunction(str(s.encode('utf-8')))

在Windows上,所有Unicode API都使用UTF-16 LE(Little Endian),因此您必须以这种方式对其进行编码:

SomeModule.SomeFunctionW(str(s.encode('utf-16-le')))

相关提示:wchar_t在不同平台上可以有不同的大小:8位,16位或32位。