Требует ли стандарт C ++ кодирования для wchar_t?
Вот некоторые выдержки из моей копии проекта стандарта N4140 2014 года
22.5 Стандартные аспекты преобразования кода [locale.stdcvt]
3 Для каждого из трех аспектов преобразования кодаcodecvt_utf8
, codecvt_utf16
, а такжеcodecvt_utf8_utf16
:
(3.1) -Elem
является типом широких символов, таким какwchar_t
, char16_t
, или жеchar32_t
.
4 Для аспектаcodecvt_utf8
:
(4.1) - Фасет должен преобразовывать между многобайтовыми последовательностями UTF-8 и UCS2 или UCS4 (в зависимости от размераElem
) в рамках программы.
Одно из толкований этих двух параграфов состоит в том, чтоwchar_t
должен быть закодирован как UCS2 или UCS4. Мне это не очень нравится, потому что, если это правда, у нас есть важное свойство языка, глубоко скрытое в описании библиотеки. Я пытался найти более прямое изложение этого свойства, но безрезультатно.
Другая интерпретация, котораяwchar_t
кодирование не обязательно должно быть UCS2 или UCS4, и в реализациях, где это не так,codecvt_utf8
не будет работать дляwchar_t
, Мне тоже не очень нравится эта интерпретация, потому что, если это правда, и ниchar
ниwchar_t
нативные кодировки - это Unicode, кажется, нет способа переносить между этими нативными кодировками и Unicode.
Какая из двух интерпретаций верна? Есть еще один, который я упустил из виду?
осветление Я не спрашиваю об общих мнениях о пригодностиwchar_t
для разработки программного обеспечения, или свойстваwchar_t
можно получить из другого места. Я заинтересованв этих двух конкретных пунктах стандарта. Я пытаюсь понять чтоэти конкретные пункты влечет за собой или не влечет за собой.
Пояснение 2, Если в 4.1 указано «фасет должен преобразовывать между многобайтовыми последовательностями UTF-8 и UCS2 или UCS4или любая другая кодировка, наложенная на wchar_t текущей глобальной локалью«Там не было бы никаких проблем. Это не так. Он говорит, что говорит. Кажется, что если кто-то используетstd::codecvt_utf8<wchar_t>
один заканчивается кучейwchar_t
кодируется как UCS2 или UCS4, независимо от текущей глобальной локали. (Нет способа указать локаль или какой-либо аспект преобразования символов дляcodecvt_utf8
). Таким образом, вопрос можно перефразировать следующим образом: является ли результат преобразования непосредственно используемым с текущей глобальной локалью (и / или с любой возможной локалью) для вывода,wctype
запросы и тд? Если нет, то что это можно использоватьза? (Если второе толкование выше верное, ответом будет «ничего»).