Python C-API: как передать строку C с нулевым завершением UNICODE UTF-16 в мое приложение python без преобразования в UTF-8?

питонисты,

Я пытаюсь написать расширение Python на C, которое передает большое количество строк C с кодировкой UNICODE UTF-16 с нулевым завершением в мое приложение Python. Строки UNICODE из моей библиотеки C гарантированно всегда будут 16-битными. Я НЕ использую wchar_t в моей библиотеке C в LINUX из-за того, что размер wchar_t может варьироваться.

Я нашел много функций (PyUnicode_AsUTF8String, PyString_FromStringAndSize, PyString_FromString и т. д.), которые делают именно то, что я хочу, но все эти функции предназначены для представления 8-битных символов/строк.

В документации Python (http://docs.python.org/howto/unicode.html) говорится:

«Под капотом Python представляет строки Unicode как 16- или 32-битные целые числа, в зависимости от того, как был скомпилирован интерпретатор Python».

Я действительно стремлюсь избежать потери производительности при преобразовании всех моих строк C UTF-16 в строки C UTF-8 только для целей интерфейса Python, особенно в Windows, если интерпретатор Python также использует 16-битный "под капотом".

Любая идея, как решить эту проблему, высоко ценится.

Спасибо, Томас


person Thomas    schedule 06.04.2012    source источник


Ответы (1)


Вы не можете избежать копирования данных (если только вы не взломаете Python C API), но вы можете создавать объекты Unicode Python непосредственно из данных UTF-16, используя PyUnicode_DecodeUTF16; см. http://docs.python.org/c-api/unicode.html#utf-16-codecs.

person Thomas Wouters    schedule 06.04.2012