wchar_t
ввести требуемый для поддержки unicode? Если не тогда какой смысл этого многобайтового типа? Почему Вы использовали бы wchar_t, когда Вы могли выполнить то же самое с char
?
Технически нет. Юникод - это стандарт, который определяет кодовые точки и не требует определенной кодировки.
Таким образом, вы можете использовать Unicode с кодировкой UTF-8, и тогда все будет помещено в одну или короткую последовательность объектов char
, и она даже будет иметь нулевой символ в конце.
Проблема с UTF-8 и UTF-16 заключается в том, что s [i]
больше не обязательно является символом, это может быть просто его часть, тогда как с достаточно широкими символами вы можете сохранить абстракция о том, что s [i]
является одним символом, хотя она не делает строк фиксированной длины при различных преобразованиях.
32-битные целые числа, по крайней мере, достаточно широки, чтобы решить проблему с кодовой точкой, но они по-прежнему не обрабатывают угловые случаи, например, преобразование чего-либо в верхний регистр может изменить количество символов.
Получается, что проблема x [i]
не решена полностью даже с помощью char32_t, а другие кодировки создают плохие форматы файлов.
Таким образом, ваша подразумеваемая точка вполне верна: wchar_t
- это сбой, отчасти потому, что Windows сделала его только 16-битным, а отчасти потому, что он не решил все проблемы и был ужасно несовместим с байтом. абстракция потока.
wchar_t
абсолютно НЕ требуется для Unicode. Например, UTF-8 поддерживает обратную совместимость с ASCII и использует простой 8-битный char
. wchar_t
в основном обеспечивает поддержку так называемых многобайтовых символов или практически любого набора символов, который закодирован с использованием большего, чем sizeof (char)
.
Потому что вы можете 't сделать то же самое с char
:
Будьте осторожны, wchar_t часто состоит из 16 бит, чего недостаточно для хранения всех символов Юникода, и это плохой выбор для данных в UTF_8, например
Вам абсолютно не нужен wchar_t
для поддержки Unicode в программном обеспечении, на самом деле использование wchar_t
еще больше усложняет задачу, потому что вы не знаете, является ли «широкая строка» UTF-16. или UTF-32 - это зависит от ОС: под windows utf-16 все остальные utf-32.
Однако utf-8 позволяет легко писать программы с поддержкой Unicode (*)
См .: https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
(*) Примечание: под Windows вам все равно придется использовать wchar_t
, потому что он не поддерживает локали utf-8, поэтому для программирования Windows с поддержкой Unicode вам придется использовать API на основе wchar.
char
обычно представляет собой один байт. ( sizeof (char)
должен быть равен 1).
wchar_t
был добавлен в язык специально для поддержки многобайтовых символов.
wchar_t не требуется. Даже не гарантируется наличие определенной кодировки. Дело в том, чтобы предоставить тип данных, который представляет широкие символы, присущие вашей системе, аналогично char, представляющему собственные символы. В Windows, например, вы можете использовать wchar_t для доступа к функциям Win32 API для широких символов.