Являются ли wchar_t и char16_t одинаковыми в Windows? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть экземпляр std::u16string, могу ли я передать его c_str() в Win32 API, который ожидает LPCWSTR, без какого-либо преобразования?Например, могу ли я безопасно сделать это:

auto u16s = std::u16string(u"Hello");
::SetWindowTextW(hWnd, reinterpret_cast<LPCWSTR>(u16s.c_str()));    

Обновлено , MSDN говорит: здесь wchar_t - UTF-16LE, а char16_t - просто UTF-16 без указания порядкового номера.Можно ли предположить, что char16_t также всегда является UTF-16LE в Windows?Или это будет специфично для компилятора MSVC, и, возможно, это может быть UTF-32LE (или, может быть, UTF-16BE), если я компилирую с GCC, например?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я хотел бы исправить @ jamesdlin's anwser , хотя его ответ правильный.

До C ++ 11 есть char и wchar_t, и, следовательно, специализироватьсяstd::basic_string<> до std::string и std::wstring.

Однако ширина в битах wchar_t зависит от платформы: в Windows она 16-разрядная, в то время как на других платформах она 32-разрядная.

А с появлением C ++ 11 стандарт добавляет char16_t для представления 16-битных широких символов;таким образом, в Windows std::u16string оказывается взаимозаменяемым с std::wstring в большинстве контекстов, потому что они оба способны представлять 16-битные широкие символы.

Тип wchar_t является широким, определяемым реализациейтип персонажа.В компиляторе Microsoft он представляет 16-битный широкий символ, используемый для хранения Unicode, закодированного как UTF-16LE, нативный тип символов в операционных системах Windows.

Но новейший MSDN, кажется, добавляет немного в сторону примечаний для кода, использующего std::wstring, но намеревающегося быть переносимым:

Размер wchar_t определяется реализацией.Если ваш код зависит от wchar_t определенного размера, проверьте реализацию вашей платформы (например, с помощью sizeof (wchar_t)).Если вам нужен строковый символьный тип с шириной, которая гарантированно останется неизменной на всех платформах, используйте string, u16string или u32string.

Что касается LE (little-endian), он должен бытьдля конкретной архитектуры, IIRC.и большинство архитектур сегодня используют LE.

0 голосов
/ 14 ноября 2018
...