如何使用ctypes来解析unicode字符串?

时间:2014-12-04 02:45:25

标签: python string unicode ctypes

使用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字符串,那么避免这种怪癖的优雅方法是什么?

谢谢!

2 个答案:

答案 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 ++库愿意接受的内容。