Ctypes: передача UTF-16 в функцию библиотеки общих объектов - PullRequest
0 голосов
/ 24 апреля 2020

Как говорится в заголовке, я пытаюсь передать строку в кодировке UTF-16 в функцию .so для Linux, но получаю странный результат.

Моя библиотека .so выглядит следующим образом (предполагается, что utf Кодировка -16 для входной строки):

int my_print(wchar_t* input){
   // do something with input
   retrun 0;
}

Начиная с python, я попробовал несколько вещей, но ни одна из них не работает (мой скрипт называется test.py):

import ctypes
import os

h = ctypes.cdll.LoadLibrary(os.getcwd() + '/myprintlib.so')
h.my_print.argtypes = [ctypes.c_wchar_p]
h.restype = [ctypes.c_int]
h.my_print('Yea')

Чтобы посмотреть, какие байты получены в моей библиотеке .so, я использовал gdb и определил его кодировку как UTF-16:

> gdb --args python3.5-dbg test.py
(gdb) set target-wide-charset UTF-16
(gdb) break my_print
(gdb) run

И заметил, что переданные байты не совместимы с UTF-16:

Breakpoint 1, my_print (input=0xb5c530 L"Y\000\000e\000\000a\000\000")

Я пытался кодировать ввод перед отправкой его в my_print, изменяя argtypes my_print и даже следуя этой ссылке , и определил новый тип строки utf-16 для ctypes, но Ни один не работал для меня.

Некоторая дополнительная информация:

  • wchar_t в моей системе составляет 4 байта.
  • Я использую python 3.5.

Спасибо!

...