Код: Выделить всё
L16=MultiByteToWideChar(CP_UTF8, 0, Utf8, L8, nullptr, 0);
Код: Выделить всё
MultiByteToWideChar(CP_UTF8, 0, Utf8, L8, Utf16, L16);
return std::wstring(Utf16);
Модераторы: Duncon, Hawk, Romeo, Eugie
Код: Выделить всё
L16=MultiByteToWideChar(CP_UTF8, 0, Utf8, L8, nullptr, 0);
Код: Выделить всё
MultiByteToWideChar(CP_UTF8, 0, Utf8, L8, Utf16, L16);
return std::wstring(Utf16);
Код: Выделить всё
template<std::size_t BUFF_SIZE = 0x100>
std::wstring toWideChar(const char* src, UINT codepage = CP_UTF8)
{
enum { MaxStackBuffSizeInWchars = BUFF_SIZE / sizeof(wchar_t) };
int srcLengthInBytes = static_cast<int>(std::strlen(src));
int lengthInWideChars = MultiByteToWideChar(codepage, 0, src, srcLengthInBytes, NULL, 0);
if (lengthInWideChars <= MaxStackBuffSizeInWchars) {
wchar_t buff[MaxStackBuffSizeInWchars];
MultiByteToWideChar(codepage, 0, src, srcLengthInBytes, buff, lengthInWideChars);
return std::wstring(buff, lengthInWideChars);
} else {
auto buff = std::make_unique<wchar_t[]>(lengthInWideChars);
MultiByteToWideChar(codepage, 0, src, srcLengthInBytes, buff.get(), lengthInWideChars);
return std::wstring(buff.get(), lengthInWideChars);
}
}
Код: Выделить всё
std::wstring ws = toWideChar("Шалом Израиль"); //Подразумевается что исходный код сохранен в UTF8
А его можно не трогать. Там прописан дефолт - 256 байт, то есть для строк чья длина меньше 256 байт динамическая память вообще не выделяется. Преобразование происходит в стеке. Если больше 256 байт, он создает временный массив в хипе.Начнём с не понятного буферсайза. С какого потолка он вообще берётся
Это внутренняя константа внутри функции. Ее область видимости ограничена функцией. Вероятно можно использовать constexpr или что-то в этом роде.Каков смысл этого енама
Чтобы удалить временный массив после выхода из функции, очевидно.Зачем здесь уникуй
Это делает make_unique.Где и как в ветви else выделяется память для результата преобразования
Деструктор unique_ptrА освобождается она где и как
Код: Выделить всё
std::string toMultibyte(const wchar_t* src, UINT codepage = CP_UTF8)
{
int wcharCount = static_cast<int>(std::wcslen(src));
int buffSize = WideCharToMultiByte(codepage, 0, src, wcharCount, NULL, 0, NULL, NULL);
char* buff = static_cast<char*>(_alloca(buffSize));
WideCharToMultiByte(codepage, 0, src, wcharCount, buff, buffSize, NULL, NULL);
return std::string(buff, buffSize);
}
Ну локальные типы от глобальных я отличаю без посторонней помощи. Вопрос не в этом, а в назначении.Это внутренняя константа внутри функции.
С какого потолка этот дефолт списан и зачем?Absurd писал(а):А его можно не трогать. Там прописан дефолт - 256 байт, то есть для строк чья длина меньше 256 байт динамическая память вообще не выделяется.
И как это удаление соотносится с уникальностью значений?Absurd писал(а):Чтобы удалить временный массив после выхода из функции, очевидно.
Не понял. Нельзя ли по подробней?Это делает make_unique.
А освобождается она где и как
Деструктор unique_ptr
Назначение описано в названии константы.Сионист писал(а):Ну локальные типы от глобальных я отличаю без посторонней помощи. Вопрос не в этом, а в назначении.
Код: Выделить всё
template<std::size_t BUFF_SIZE = 0x100>
std::string toMultibyte(const wchar_t* src, UINT codepage = CP_UTF8)
{
int wcharCount = static_cast<int>(std::wcslen(src));
int buffSize = WideCharToMultiByte(codepage, 0, src, wcharCount, NULL, 0, NULL, NULL);
if (buffSize <= BUFF_SIZE) {
char buff[BUFF_SIZE];
WideCharToMultiByte(codepage, 0, src, wcharCount, buff, buffSize, NULL, NULL);
return std::string(buff, buffSize);
} else {
auto buff = std::make_unique<char[]>(buffSize);
WideCharToMultiByte(codepage, 0, src, wcharCount, buff.get(), buffSize, NULL, NULL);
return std::string(buff.get(), buffSize);
}
}
Если не устраивает дефолт размер можно передать явно через параметр шаблона.Сионист писал(а):С какого потолка этот дефолт списан и зачем?
unique_ptr - уникальный указатель, а не значение.Сионист писал(а):И как это удаление соотносится с уникальностью значений?
Деструктор unique_ptr делает delete[] для массивов, ничего непонятного тут нетСионист писал(а):Не понял. Нельзя ли по подробней?Деструктор unique_ptr
Какой константы? У Вас их вообще нет.Absurd писал(а):Назначение описано в названии константы.
А где его вообще брать?Absurd писал(а):Если не устраивает дефолт размер можно передать явно через параметр шаблона.
А где там вообще ptr то?Absurd писал(а):unique_ptr - уникальный указатель, а не значение.
А где массив?Absurd писал(а):Деструктор unique_ptr делает delete[] для массивов, ничего непонятного тут нет