Требуется ли wchar_t для поддержки Unicode?

Требуется ли тип wchar_t для поддержки Unicode? Если нет, то какая точка этого многобайтового типа? Зачем вам использовать wchar_t, если вы можете выполнить одно и то же с char?

Ответ 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).

Ответ 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 был добавлен в язык специально для обозначения многобайтовых символов.