Самый простой способ преобразовать широкую строку или широкий массив символов в простой массив символов?

Моя переменная находится в конкретной внутренней реализации широкой строки, но я могу довольно легко сделать ее массивом широких символов. Проблема в том, что мне нужно передать его библиотечной функции, которая будет принимать только массивы символов.

Итак, я заканчиваю тем, что выглядит так:

wchar_t* wstr;

// char* str = "need some processing here";

function(str);

Итак, есть ли простой способ или мне просто делать это вручную посимвольно?


person Sabre Runner    schedule 24.09.2012    source источник
comment
Это немного зависит от того, что вы пытаетесь сделать с результатом и что содержит оригинал. Если вы просто хотите обрабатывать символы ASCII, вам понадобится std::ctype<whar_t>::narrow(). Если функция ожидает многобайтовую кодировку, необходимо что-то вроде wcstombs(). Обратите внимание, что последние обычно считаются не символами, а последовательностью байтов.   -  person Dietmar Kühl    schedule 24.09.2012
comment
Кажется, это работает для меня, хотя я нашел лучшее решение своей проблемы, которое не требует этого преобразования. Но все равно спасибо.   -  person Sabre Runner    schedule 27.09.2012


Ответы (1)


char* может означать многое. Если функция, принимающая char*, на самом деле принимает UTF8, есть способы преобразовать UTF16 или UTF32 в UTF8. wchar_t обычно используется для хранения UTF16 (Windows) или UTF32 (macosx) среди других кодировок.

Посмотрите здесь ConvertUTF.c/.h

код unicode.org

person cppguy    schedule 24.09.2012
comment
Как я могу узнать, использует ли он UTF-8 или нет? - person Sabre Runner; 27.09.2012
comment
Проще говоря, UTF8 - это один из многих способов кодирования массива символов для представления большинства символов/букв/символов/и т. д.... большинства языков. Это, наверное, самое популярное. Если вы вызываете функцию, определенную какой-либо библиотекой, проверьте документацию, чтобы узнать, какой тип char* она ожидает. Многие популярные API ожидают, что char* будет UTF8. Если вы знаете, что ваш ввод wchar_t всегда будет состоять только из английских символов (коды ascii от 32 до 127), вы можете преобразовать wchar_t в char*, используя вышеупомянутую библиотеку, потому что эти символы допустимы во всех схемах кодирования char*. - person cppguy; 27.09.2012