Как настроить python ctypes 'c_wchar_p' и 'c_char_p' restype?

В 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 ?

  • Что такое символ @ @ в Python?
  • Эластичный beanstalk требует python 3.5
  • asyncio.ensure_future vs. BaseEventLoop.create_task против простой сопрограммы?
  • filedialog, tkinter и открывающие файлы
  • Конструкция объекта Python 3: что является наиболее Pythonic / принято?
  • Поиск ближайшего значения и возврат индекса массива в Python
  • «Unicode Error» unicodeescape »кодек не может декодировать байты ... Не удается открыть текстовые файлы в Python 3
  • Не удалось загрузить встроенную среду выполнения TensorFlow. Python 3.5.2
  • One Solution collect form web for “Как настроить python ctypes 'c_wchar_p' и 'c_char_p' restype?”

    Вы можете подклассифицировать c_char_p для декодирования строки UTF-8 с помощью _check_retval_ hook. Например:

     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 , но поскольку это класс, вы можете использовать свойство или настраиваемый дескриптор для кодирования и декодирования байтов.

    Python - лучший язык программирования в мире.