Строка C до широкой строки C

Я уверен, что этот вопрос часто задают, но я просто хочу убедиться, что нет лучшего способа сделать это.

По сути, у меня есть 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;

Мне нужно делать эти преобразования во многих местах, так как я имею дело со сторонними библиотеками, которые ожидают одно или другое. Это рекомендуемый способ сделать это?

2

Решение

То, что вы делаете, является в значительной степени рекомендуемым способом сделать это, предполагая, что ваши данные все 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.

2

Другие решения

Вы не сказали, какие кодировки задействованы. Если у вас есть не многобайтовые строки, вы можете просто использовать это:

std::string a("hello");
std::wstring b(s.begin(), s.end());

const wchar_t *wcString= b.c_str();
0