Ответ 1
На практике практически невозможно гарантировать широкие наборы символов, поскольку стандарты C и С++ требуют, чтобы все широкие символы могли быть представлены с одним значением кодирования, тогда как стандартом в программировании Windows был широко распространенный текст в формате UTF-16, Первоначально широкоформатный текст Windows был просто оригинальным 16-разрядным Unicode, теперь называемым UCS-2, который по-прежнему используется в Windows-консолях Windows и соответствует требованиям C и С++. UTF-16 является расширением UCS-2, которое использует два значения кодирования, называемых суррогатной парой, для символов вне исходного Unicode Basic Multilingual Plane, a.k.a. BMP.
Re
" Верно ли, что интегральные значения
'x'
иL'x'
должны быть равны? [Когда x является членом набора символов исходного кода С++]
Основной набор символов источника - это подмножество ASCII, и почти все существующие кодировки общего характера, включая, в частности, кодировки Unicode, являются расширениями ASCII. Существует одно исключение, а именно кодирование символов IBM EBCDIC (существует несколько вариантов). Однако, если он все еще используется вообще, то это на мэйнфреймах IBM.
Таким образом, на практике у вас есть эта гарантия, но в формальном виде у вас ее нет. Что еще более важно, однако, это нерелевантный. Например, в базовом наборе исходных символов отсутствует знак $, который вы вряд ли можете ожидать обойтись, т.е. Ограничение себя базовым набором символов источника не является практическим предложением.
Re
" Верно ли, что
std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
должно быть равноL'x'
в некоторой (или любой) локали [Когда x является членом набора символов исходного кода С++]
По той же причине, что и для литералов, да на практике нет в формальном (поскольку поддерживаются кодировки, такие как EBCDIC), а также это не имеет отношения к практическому специалисту.
В частности, для практического использования более важным является то, что Microsoft Visual С++ имеет (недокументированный) Windows ANSI в качестве его набора символов исполнения, а UTF-16 - как широкую кодировку символов. Например. на моей машине набор символов выполнения - Windows 1252, a.k.a. Windows ANSI Western. И некоторые символы, в частности, имеют совершенно разные коды символов Юникода. Хуже того, может быть только некоторый узкий набор символов, который можно было бы использовать как набор символов выполнения, где кодировка UTF-16 какого-либо символа использовала бы суррогатную пару значений кодирования. И в этом случае widen
не может даже представить результат; там нет места.