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
test для использованияmbstowcs
на системах, отличных от Windows, иmbstowcs_s
на системах Windows.Вы также можете использовать
mbstowcs
, чтобы получить длину преобразованной строки, сначала передавNULL
для назначения. Таким образом, вы можете избежать усечения независимо от длины входной строки; однако для этого требуется преобразовать строку дважды.Для не-ASCII преобразования, я рекомендую использовать libiconv .