Сколько памяти занимает w_char? C++
В c++ есть символьный тип char, 1 байт. А сколько байт отводится для w_char? И с какой кодировкой работает w_char? Я слышал, что он занимает 2 байта. Значит ли это что w_char - это Unicode, или может и в другие кодировки? Может ли w_char быть более 2 байт?
Ответы (2 шт):
И размер и представление wchar_t зависит от реализации.
На практике на большинстве систем — это 4 байта и UTF-32. На win — 2 байта и UTF-16 (по факту — UCS-2).
wchar_t - это компиляторно зависимый тип. И уже разработчики компилятора решают, каким его сделать. Обычно в visual studio он занимает 2 байта и хранит uft-16 (если точнее - UCS2 + суррогатные пары). Такой формат родной для Windows и поэтому, это очень удобно. В случае Linux, gcc использует 4 байтовый wchar_t. Да, это немного растратно, но зато можно хранить сразу utf-32 - то есть, прямо unicode codepoint. Такой подход существенно упрощает расчет длины строки и разные манипуляции в отличии от подхода windows, где нужно учитывать суррогатные пары.
Но кто использует суррогатные пары (это когда для кодирования символа используются два 2байтовых wchar_t)? В основном это эмодзи и разные странные символы. А в большинстве случаев 2 байт на символ хватает с головой.
Значит ли это что w_char - это Unicode, или может и в другие кодировки?
юникод это не кодировка. Кодировки это utf-8, utf-16. А юникод это просто таблица, в которой каждому символу приписан номер. Но в случае кодировки utf-32 номера совпадают с кодами.
Может ли w_char быть более 2 байт?
даже хуже. В старых адроидах (до 2.2 какой то версии) в NDK wchar_t был один байт. нормально.