Нужен ли wchar_t для поддержки юникода? - PullRequest
29 голосов
/ 14 февраля 2010

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

Ответы [ 8 ]

33 голосов
/ 14 февраля 2010

номер

Технически, нет. Unicode - это стандарт, который определяет кодовые точки и не требует определенной кодировки.

Таким образом, вы можете использовать юникод с кодировкой UTF-8, и тогда все будет помещаться в одну или короткую последовательность char объектов, и она все равно будет заканчиваться нулем.

Проблема с UTF-8 и UTF-16 заключается в том, что s[i] уже не обязательно является символом, это может быть просто кусок единицы, в то время как с достаточно широкими символами вы можете сохранить абстракцию, которой является s[i] один символ, хотя он не создает строк фиксированной длины при различных преобразованиях.

32-разрядные целые числа, по крайней мере, достаточно широки, чтобы решить проблему с точкой кода, но они по-прежнему не обрабатывают угловые случаи, например, повышение значения может изменить количество символов.

Таким образом, получается, что проблема x[i] не полностью решается даже char32_t, а эти другие кодировки создают плохие форматы файлов.

Таким образом, подразумеваемая вами точка зрения вполне верна: wchar_t является ошибкой, отчасти потому, что Windows сделала ее только 16 битами, а отчасти потому, что она не решала все проблемы и была ужасно несовместима с абстракцией потока байтов. 1020 *

8 голосов
/ 14 февраля 2010

Вам абсолютно не нужно 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, поэтому для программирования окон с поддержкой юникода вы должны использовать wchar API.

6 голосов
/ 26 марта 2015

Как уже отмечалось, wchar_t абсолютно не нужен для поддержки юникода. Мало того, это также совершенно бесполезно для этой цели, так как стандарт не предоставляет гарантию фиксированного размера для wchar_t (другими словами, вы заранее не знаете, какой sizeof (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 (многобайтовый набор символов). Оба они

А) сбивает с толку и Б) откровенная ложь

потому что ни конфигурация «UNICODE» в Visual Studio не делает ничего, чтобы купить программисту фактическую поддержку Unicode, ни различие, подразумеваемое этими двумя конфигурациями сборки, не имеет никакого смысла. Для объяснения Microsoft рекомендует использовать TCHAR вместо использования char или wchar_t напрямую. В конфигурации MBCS TCHAR расширяется до char, что означает, что вы потенциально можете использовать это для реализации поддержки UTF-8. В конфигурации UNICODE он расширяется до wchar_t, который в Visual Studio имеет ширину 16 бит и потенциально может быть использован для реализации поддержки UTF-16 (насколько мне известно, это встроенная кодировка, используемая Windows) , Однако оба этих кодировок являются многобайтовыми наборами символов, поскольку как UTF-8, так и UTF-16 допускают возможность того, что конкретный символ Unicode может быть закодирован как более одного char / wchar_t соответственно, поэтому термин многобайтовый набор символов (в отличие от однобайтового набора символов?) имеет мало смысла.

Чтобы добавить оскорбление к травме, простое использование конфигурации Unicode фактически не дает вам ни йоты поддержки Unicode. Чтобы действительно получить это, вы должны использовать реальную библиотеку Unicode, такую ​​как ICU (http://site.icu -project.org / ). Короче говоря, тип wchar_t и конфигурации Microsoft MBCS и UNICODE ничего не добавляют и не вызывают ненужной путаницы, и мир стал бы значительно лучше, если бы ни один из них не был изобретен.

</slightly OffTopic Microsoft-specific rant>
5 голосов
/ 14 февраля 2010

wchar_t абсолютно НЕ требуется для Unicode.UTF-8, например, поддерживает обратную совместимость с ASCII и использует простой 8-битовый char.wchar_t в основном дает поддержку так называемых многобайтовых символов, или в основном любой набор символов, который закодирован с использованием более sizeof(char).

3 голосов
/ 14 февраля 2010

Будьте осторожны, wchar_t часто составляет 16 бит, что недостаточно для хранения всех символов Юникода и является неправильным выбором данных в UTF_8, например

3 голосов
/ 14 февраля 2010

wchar_t не требуется. Даже не гарантируется наличие конкретной кодировки. Суть в том, чтобы предоставить тип данных, который представляет широкие символы, встроенные в вашу систему, подобно char, представляющему собственные символы. Например, в Windows вы можете использовать wchar_t для доступа к широким символам Win32 API.

2 голосов
0 голосов
/ 14 февраля 2010

char - это обычно один байт. (sizeof(char) должно быть равно 1).

wchar_t был добавлен в язык специально для использования многобайтовых символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...