Требуется ли тип wchar_t
для поддержки Unicode? Если нет, то какая точка этого многобайтового типа? Зачем вам использовать wchar_t, если вы можете выполнить одно и то же с char
?
Требуется ли wchar_t для поддержки Unicode?
Ответ 1
Нет.
Технически, нет. Unicode - это стандарт, который определяет кодовые точки и не требует конкретной кодировки.
Итак, вы можете использовать unicode с кодировкой UTF-8, а затем все будет вписываться в одну или короткую последовательность объектов char
, и она даже будет заканчиваться нулями.
Проблема с UTF-8 и UTF-16 заключается в том, что s[i]
уже не обязательно является символом, он может быть просто частью одного, тогда как с достаточно широкими символами вы можете сохранить абстракцию, которая s[i]
равна один символ, он не делает строки фиксированной длины при различных преобразованиях.
32-разрядные целые числа, по меньшей мере, достаточно широкие, чтобы решить проблему с кодовой точкой, но они по-прежнему не обрабатывают угловые случаи, например, восходящее что-то может изменить количество символов.
Итак, оказывается, что проблема x[i]
не полностью решена даже char32_t, а те другие кодировки делают плохие форматы файлов.
Таким образом, ваша подразумеваемая точка вполне допустима: wchar_t
является сбоем, отчасти потому, что Windows сделала его всего 16 бит, а отчасти потому, что не решила каждую проблему и была ужасно несовместима с абстракцией потока байтов.
Ответ 2
Вам абсолютно не нужно 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, поэтому для программирования окон с поддержкой unicode вы должны использовать API на основе wchar.
Ответ 3
wchar_t
НЕОБХОДИМО для Unicode. Например, UTF-8 поддерживает обратную совместимость с ASCII и использует простой 8-разрядный char
. wchar_t
в основном дает поддержку так называемых многобайтовых символов или в основном любой набор символов, который кодируется с использованием более чем sizeof(char)
.
Ответ 4
Поскольку вы не можете выполнить то же самое с char
:
Ответ 5
wchar_t не требуется. У него даже не гарантируется определенная кодировка. Дело в том, чтобы предоставить тип данных, который представляет собой широкие символы, свойственные вашей системе, подобно char, представляющие собственные символы. Например, в Windows вы можете использовать wchar_t для доступа к широким функциям API Win32.
Ответ 6
Будьте осторожны, wchar_t часто занимает 16 бит, что недостаточно для хранения всех символов в Юникоде и является плохим выбором данных в UTF_8, например
Ответ 7
Как уже отмечалось, wchar_t абсолютно не требуется для поддержки Unicode. Кроме того, это также совершенно бесполезно для этой цели, поскольку стандарт не гарантирует фиксированную размерность для wchar_t (другими словами, вы заранее не знаете, какой размерof (wchar_t) будет находиться в конкретной системе) тогда как sizeof (char) всегда будет 1.
В кодировке UTF-8 любой фактический символ UNICODE отображается в последовательность из одного или нескольких (до четырех, я считаю) октетов. В кодировке UTF-16 любой фактический символ UNICODE отображается в последовательность из одного или нескольких (до двух, я считаю) 16-разрядных слов. В кодировке UTF-32 любой фактический символ UNICODE отображается ровно на одно 32-битное слово.
Как вы можете видеть, wchar_t может быть полезен для поддержки поддержки UTF-16 IF, стандарт был достаточно хорош, чтобы гарантировать, что wchar_t всегда 16 бит. К сожалению, этого не происходит, поэтому в любом случае вам придется возвращать целочисленный тип фиксированной ширины от <cstdint>
(например, std:: uint16_t).
<slightly OffTopic Microsoft-specific rant>
Что еще больше бесит, это дополнительная путаница, вызванная конфигурациями сборки Microsoft Visual Studio UNICODE и MBCS (многобайтовый набор символов). Оба эти
A) запутывают и B) прямая ложь
потому что ни одна конфигурация "UNICODE" в Visual Studio ничего не делает, чтобы купить реальную поддержку Unicode программиста, и разница между этими 2 конфигурациями сборки не имеет смысла. Чтобы объяснить, Microsoft рекомендует использовать TCHAR вместо использования char или wchar_t напрямую. В конфигурации MBCS TCHAR расширяется до char, что означает, что вы можете использовать это для реализации поддержки UTF-8. В конфигурации UNICODE она расширяется до wchar_t, которая в Visual Studio имеет ширину 16 бит и потенциально может использоваться для реализации поддержки UTF-16 (которая, насколько мне известно, является собственной кодировкой, используемой Windows), Однако оба эти кодирования являются многобайтовыми наборами символов, поскольку оба UTF-8 и UTF-16 допускают возможность того, что конкретный символ Юникода может быть закодирован как более чем один char/wchar_t соответственно, поэтому термин multi -байтный набор символов (в отличие от однобайтового набора символов?) мало смысла.
Чтобы добавить оскорбление к травме, просто использование конфигурации Unicode фактически не дает вам ни одной поддержки Unicode. Чтобы получить это, вы должны использовать фактическую библиотеку Unicode, такую как ICU (http://site.icu-project.org/). Короче говоря, конфигурации wchar_t и Microsoft MBCS и UNICODE не добавляют ничего полезного и вызывают ненужную путаницу, и мир будет значительно лучше, если ни один из них никогда не был изобретен.
</slightly OffTopic Microsoft-specific rant>
Ответ 8
char
обычно представляет собой один байт. (sizeof(char)
должно быть равно 1).
wchar_t
был добавлен в язык специально для обозначения многобайтовых символов.