Python: передача строки юникода в модуль C ++ - PullRequest
6 голосов
/ 19 сентября 2010

Сейчас я работаю с существующим модулем, который предоставляет интерфейс C ++ и выполняет несколько операций со строками.

Мне нужно было использовать строки Unicode, и модуль, к сожалению, не имел никакой поддержки дляинтерфейс Unicode, поэтому я написал дополнительную функцию для добавления в интерфейс:

void SomeUnicodeFunction(const wchar_t* string)

Однако, когда я пытаюсь использовать следующий код в Python:

SomeModule.SomeUnicodeFunction(ctypes.c_wchar_p(unicode_string))

, я получаю этоошибка:

ArgumentError: Python argument types in
    SomeModule.SomeUnicodeFunction(SomeModule, c_wchar_p)
did not match C++ signature:
    SomeUnicodeFunction(... {lvalue}, wchar_t const*)

(имена были изменены).

Я попытался изменить wchar_t в модуле C ++ на Py_UNICODE, но безуспешно.Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Для Linux вам не нужно менять свой API, просто выполните:

SomeModule.SomeFunction(str(s.encode('utf-8')))

В Windows все API-интерфейсы Unicode используют UTF-16 LE (Little Endian), поэтому вы должны кодировать его следующим образом:

SomeModule.SomeFunctionW(str(s.encode('utf-16-le')))

Полезно знать : wchar_t может иметь разные размеры на разных платформах: 8, 16 или 32 бита.

2 голосов
/ 19 сентября 2010

Найден хак, чтобы обойти проблему:

SomeModule.SomeUnicodeFunction(str(s.encode('utf-8')))

Кажется, до сих пор он отлично работал для моих целей.

Обновление: на самом деле, использование UTF-8 означает, что я избегаю какой-либо необходимости в SomeUnicodeFunction и могу использовать стандартную SomeFunction, не специализируясь на юникоде. Я узнаю что-то новое каждый день, я думаю:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...