Я столкнулся с подобной проблемой. Я написал карту типов SWIG для пользовательского массива char
(фактически unsigned char
), и он получил SEGFAULT при использовании Python 3. Поэтому я отладил код в карте типов и понял, что Леннарт обнаружил проблему.
Мое решение этой проблемы заключалось в следующем в этой карте типов:
%typemap(in) byte_t[MAX_FONTFACE_LEN] {
if (PyString_Check($input))
{
$1 = (byte_t *)PyString_AsString($input);
}
else if (PyUnicode_Check($input))
{
$1 = (byte_t *)PyUnicode_AsEncodedString($input, "utf-8", "Error ~");
$1 = (byte_t *)PyBytes_AS_STRING($1);
}
else
{
PyErr_SetString(PyExc_TypeError,"Expected a string.");
return NULL;
}
}
То есть я проверяю, что это за строковый объект PyObject
. Функции PyString_AsString()
и PyUnicode_AsString()
вернут > 0
, если их ввод будет строкой UTF-8 или Unicode соответственно. Если это строка Unicode, мы конвертируем эту строку в байты при вызове PyUnicode_AsEncodedString()
, а позже мы конвертируем эти байты в char *
с помощью вызова PyBytes_AS_STRING()
.
Обратите внимание, что я смутно использую эту же переменную для хранения строки в юникоде и преобразования ее позже в байты. Несмотря на то, что это было так сомнительно и, возможно, это могло произойти в другом обсуждении стиля кодирования, факт в том, что я решил свою проблему. Я протестировал его с двоичными файлами python3
и python2.7
без каких-либо проблем.
И, наконец, последняя строка предназначена для репликации исключения в вызове python, чтобы сообщить, что входные данные не были строкой, ни utf, ни unicode.