Я работаю над тем, чтобы разговаривать с библиотекой, которая обрабатывает строки как массивы wchar_t. Мне нужно преобразовать их в массивы char, чтобы я мог передать их Python (используя функцию SWIG и Python PyString_FromString). Очевидно, что не все широкие символы могут быть преобразованы в символы. Согласно документации для wcstombs, я должен был бы сделать что-то вроде
wcstombs(NULL, wideString, wcslen(wideString))
для проверки строки для неконвертируемых символов - она должна возвращать -1, если она есть. Однако в моем тестовом примере он всегда возвращает -1. Здесь моя тестовая функция:
void getString(wchar_t* target, int size) {
int i;
for(i = 0; i < size; ++i) {
target[i] = L'a' + i;
}
printf("Generated %d characters, nominal length %d, compare %d\n", size,
wcslen(target), wcstombs(NULL, target, size));
}
Это генерирует вывод следующим образом:
Generated 32 characters, nominal length 39, compare -1
Generated 16 characters, nominal length 20, compare -1
Generated 4 characters, nominal length 6, compare -1
Любая идея, что я делаю неправильно?
В соответствующей заметке, если вы знаете способ конвертировать непосредственно из wchar_t * s в строки юникода Python, это было бы желательно. :) Благодарю!
Очевидно, что, как вы выяснили, важно, чтобы нулевые завершающие входные данные.
Что касается последнего абзаца, я бы конвертировал его из широкого формата в UTF8 и вызывал PyUnicode_FromString.
Обратите внимание, что я предполагаю, что вы используете Python 2.x, предположительно все это в Python 3.x.