我正在使用现有模块,提供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但没有成功。我该如何解决这个问题?
答案 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位。