Я уверен, что этот вопрос часто задают, но я просто хочу убедиться, что нет лучшего способа сделать это.
По сути, у меня есть const char *, который указывает на C-строку с нулевым символом в конце. У меня есть другая функция, которая ожидает const wchar_t *, указывающий на строку с теми же символами.
В настоящее время я пытаюсь сделать это так:
size_t newsize = strlen(myCString) + 1;
wchar_t * wcstring = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcstring, newsize, myCString, _TRUNCATE);
delete[] wcstring;
Мне нужно делать эти преобразования во многих местах, так как я имею дело со сторонними библиотеками, которые ожидают одно или другое. Это рекомендуемый способ сделать это?
То, что вы делаете, является в значительной степени рекомендуемым способом сделать это, предполагая, что ваши данные все ASCII. Если у вас есть данные, отличные от ASCII, вам необходимо знать, какова их кодировка: UTF-8, Windows-1252, любой из вариантов ISO 8859, SHIFT-JIS и т. Д. Каждый из них необходимо преобразовать по-своему. ,
Единственное, что я хотел бы изменить, это использовать mbstowcs
вместо mbstowcs_s
, mbstowcs_s
доступно только в Windows, в то время как mbstowcs
это стандартная функция C99, которая является портативной. Конечно, если вы хотите избежать предупреждений об устаревании CRT с помощью компилятора Microsoft, не отключая их полностью, то вполне нормально использовать макрос #if
тест для использования mbstowcs
в не-Windows системах и mbstowcs_s
в системах Windows.
Вы также можете использовать mbstowcs
чтобы получить длину преобразованной строки, сначала передав в NULL
для назначения. Таким образом, вы можете избежать усечения независимо от длины входной строки; Тем не менее, это включает в себя преобразование строки дважды.
Для не-ASCII преобразований я рекомендую использовать libiconv.
Вы не сказали, какие кодировки задействованы. Если у вас есть не многобайтовые строки, вы можете просто использовать это:
std::string a("hello");
std::wstring b(s.begin(), s.end());
const wchar_t *wcString= b.c_str();