преобразование строки в Unicode в C - PullRequest
1 голос
/ 12 января 2012

У меня есть строка в переменной, и эта строка происходит из основной части проекта.Теперь я хочу преобразовать это в строку Unicode.Как я могу это сделать и добавить L или _T () или TEXT () не вариант.Чтобы прояснить ситуацию, см. Ниже

Void foo(char* string) {
    //Here the contents of the variable STRING should be converted to Unicode
    //The soln should be possible to use in C code.
}

TIA Naveen

Ответы [ 2 ]

1 голос
/ 12 января 2012

L используется для создания литералов wchar_t.

Из вашего комментария о SafeArrayPutElement и того, как вы используете термин «Unicode», ясно, что вы используете Windows.Предполагая, что char* string находится в устаревшей кодировке, которую использует Windows, а не UTF-8 или что-то (безопасное предположение для Windows), вы можете получить строку wchar_t следующими способами:

// typical Win32 conversion in C
int output_size = MultiByteToWideChar(CP_ACP,0,string,-1,NULL,0);
wchar *wstring = malloc(output_size * sizeof(wchar_t));
int size = MultiByteToWideChar(CP_ACP,0,string,-1,wstring,output_size);
assert(output_size==size);

// make use of wstring here

free(wstring);

ЕслиЕсли вы используете C ++, вы можете захотеть сделать это исключение безопасным, используя вместо этого std :: wstring (для этого требуется чуть-чуть C ++ 11 и, следовательно, может потребоваться VS2010 или выше):

std::wstring ws(output_size,L'\0');
int size = MultiByteToWideChar(CP_ACP,0,string,-1,ws.data(),ws.size());
// MultiByteToWideChar tacks on a null character to mark the end of the string, but this isn't needed when using std::wstring.
ws.resize(ws.size() -1);

// make use of ws here. You can pass a wchar_t pointer to a function by using ws.c_str()

//std::wstring handles freeing the memory so no need to clean up

Вот еще одинметод, который использует больше стандартной библиотеки C ++ (и использует тот факт, что VS2010 не полностью совместим со стандартами):

#include <locale> // for wstring_convert and codecvt

std::wstring ws = std::wstring_convert<std::codecvt<wchar_t,char,std::mbstate_t>,wchar_t>().from_bytes(string);

// use ws.c_str() as before

Вы также подразумеваете в комментариях, что пытались конвертировать в wchar_t и получили ту же ошибку.Если это тот случай, когда вы пытаетесь использовать эти методы для преобразования в wchar_t, то ошибка находится в другом месте.Вероятно, в фактическом содержании вашей строки.Возможно, он не завершен должным образом?

0 голосов
/ 12 января 2012

Вы не можете сказать «преобразовано в Unicode». Вам необходимо указать кодировку , Unicode - это не кодировка, а (примерно) набор символов и набор кодировок для выражения этих символов в виде последовательности байтов.

Кроме того, вы должны указать входную кодировку, например, как. символ, такой как "å", закодированный в string?

...