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, то ошибка находится в другом месте.Вероятно, в фактическом содержании вашей строки.Возможно, он не завершен должным образом?