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

6 投票
2 回答
4007 浏览
提问于 2025-04-16 04:19

我现在正在使用一个现有的模块,这个模块提供了一个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位。

撰写回答