使用Python的ctypes模块将字符串从Python发送到C ++需要您将其解析为c_char_p(char *)。我发现我需要使用python pure 字符串而不是python unicode 字符串。如果我使用unicode字符串,变量就会被覆盖而不是被正确发送。这是一个例子:
C ++
void test_function(char * a, char * b, char * c) {
printf("Result: %s %s %s", a, b, c);
}
的Python
... load c++ using ctypes ...
lib.test_function.argtypes = [c_char_p, c_char_p, c_char_p]
lib.test_function(u'x', u'y', u'z')
lib.test_function('x', 'y', 'z')
运行上面的Python代码在stdout中提供以下内容:
Result: z z z
Result: x y z
为什么这是一个ctypes的怪癖?如果我能获得unicode字符串,那么避免这种怪癖的优雅方法是什么?
谢谢!
答案 0 :(得分:1)
尝试c_wchar而不是c_char: https://docs.python.org/2/library/ctypes.html
答案 1 :(得分:0)
C/C++ has no real support for Unicode,所以你无能为力。您必须对字符串进行编码,以便将它们传递到C / C ++世界:根据您的使用情况,您可以使用UTF-8,UTF-16或UTF-32。
例如,您可以将它们编码为UTF-8并传入一个字节数组(Python中的bytes
和C / C ++中的char *
):
lib.test_function(u'x'.encode('utf8'),
u'y'.encode('utf8'),
u'z'.encode('utf8'))
您选择的编码究竟是另一个故事,但它取决于您的C ++库愿意接受的内容。