4

在 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与 pythonc_wchar_p一样,但是当我这样做时,我得到.strret.encode('utf16')UnicodeDecodeError

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

4

1 回答 1

5

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

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')
'ȁ'

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

于 2013-07-03T00:45:20.863 回答