如何自定义Python ctypes'c_wchar_p'和'c_char_p'重定型?

时间:2013-07-02 20:11:27

标签: python python-3.x ctypes

在Python 3中

function_name.restype = c_char_p # returns bytes

我有很多这样的功能,我需要做的每一个str(ret, 'utf8')。如何创建一个自动执行此操作的custom_c_char_p

function_name.restype = custom_c_char_p # should return str

C库还输出UTF-16为c_wchar_p,它以str形式传递给python, 但当我ret.encode('utf16')时,我会UnicodeDecodeError

如何自定义c_wchar_p以确保Python知道它转换UTF-16以获得正确的str

1 个答案:

答案 0 :(得分:4)

您可以使用c_char_p挂钩对_check_retval_进行子类化以解码UTF-8字符串。例如:

import ctypes

class c_utf8_p(ctypes.c_char_p):  
    @classmethod      
    def _check_retval_(cls, result):
        value = result.value
        return value.decode('utf-8')

例如:

>>> PyUnicode_AsUTF8 = ctypes.pythonapi.PyUnicode_AsUTF8
>>> PyUnicode_AsUTF8.argtypes = [ctypes.py_object]
>>> PyUnicode_AsUTF8.restype = c_utf8_p
>>> PyUnicode_AsUTF8('\u0201')
'ȁ'

这不适用于Structure中的字段,但由于它是一个类,因此您可以使用属性或自定义描述符对字节进行编码和解码。