Ответ 1
Точная природа широких символов (целенаправленно) определяется левой реализацией.
Когда они впервые изобрели концепцию wchar_t
, ISO 10646 и Unicode все еще конкурировали друг с другом (тогда как сейчас они в основном сотрудничают). Вместо того, чтобы пытаться указывать, что международный символ будет тем или иным (или, возможно, совсем другим), он просто предоставил тип (и некоторые функции), который реализация могла бы определить для поддержки международных наборов символов по своему усмотрению.
Различные реализации использовали этот потенциал для изменения. Например, если вы используете компилятор Microsoft в Windows, wchar_t
будет иметь 16-разрядный тип, содержащий UIF-16 Unicode (первоначально он состоял из Unicode UCS-2, но теперь он официально устарел).
В Linux wchar_t
чаще будет 32-разрядным типом, поддерживающим кодировку Unicode, кодированной UCS-4/UTF-32. Порты gcc по крайней мере в некоторых других операционных системах делают то же самое, хотя я никогда не пытался подтвердить, что это всегда так.
Однако это не гарантирует. По крайней мере теоретически реализация на Linux могла бы использовать 16 бит, или одна на Windows могла бы использовать 32 бита, или любой из них мог бы решить использовать 64 бита (хотя я был бы немного удивлен, увидев это на самом деле).
В любом случае общая идея о том, как все должно работать, состоит в том, что для представления кодовой точки достаточно одного wchar_t
. Для ввода-вывода данные предназначены для преобразования из внешнего представления (независимо от того, что оно есть) в wchar_t
s, что (должно быть) делает их относительно легко манипулировать. Затем во время вывода они снова преобразуются в кодировку по вашему выбору (которая может сильно отличаться от прочитанной вами кодировки).