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 2

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 .

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

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

const wchar_t *wcString= b.c_str();