Тестирование wchar_t * для конвертируемых символов

1

Я работаю над тем, чтобы разговаривать с библиотекой, которая обрабатывает строки как массивы 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, это было бы желательно. :) Благодарю!

  • 0
    Мне было указано, что я забыл написать терминатор в строку. Изменение цикла for для перехода к size - 1, а затем запись '\ 0' в качестве последнего символа заставило wcstombs вести себя самостоятельно. Извините, что трачу ваше время! Хотя, если кто-то знает более прямое обращение, чем прохождение через char, это все равно было бы здорово.
  • 0
    Это может не быть проблемой, но вы должны передать 0 в качестве параметра count для wcstombs. Предполагается, что это будет размер в байтах выходного буфера, который равен NULL.
Теги:
widechar

1 ответ

0

Очевидно, что, как вы выяснили, важно, чтобы нулевые завершающие входные данные.

Что касается последнего абзаца, я бы конвертировал его из широкого формата в UTF8 и вызывал PyUnicode_FromString.

Обратите внимание, что я предполагаю, что вы используете Python 2.x, предположительно все это в Python 3.x.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню