Как компилятор должен интерпретировать файл UTF-8, который содержит символы не ASCII внутри этих новых типов строковых литералов.Я понимаю, что стандарт не определяет кодировки файлов, и один только этот факт сделает интерпретацию не-ASCII-символов внутри исходного кода совершенно неопределенным поведением, сделав эту функцию чуть менее полезной.
От n3290, 2.2 Фазы перевода [lex.phases]
Физические символы исходного файла отображаются, в соответствии с реализацией, в базовый исходный набор символов (введение символов новой строки для конца строки).линейные индикаторы) при необходимости.Допустимый набор физических символов исходного файла определяется реализацией.[ Вот немного о триграфах. ] Любой символ исходного файла, не входящий в базовый набор символов источника (2.3), заменяется универсальным именем символа, которое обозначает этот символ.(Реализация может использовать любую внутреннюю кодировку, если фактический расширенный символ, встречающийся в исходном файле, и тот же расширенный символ, выраженный в исходном файле, что и имя универсального символа (т. Е. С использованием нотации \ uXXXX),обрабатывается эквивалентно, за исключением случаев, когда эта замена возвращается в виде необработанного строкового литерала.)
Существует множество стандартных терминов, используемых для описания того, как реализация работает с кодировками.Вот моя попытка сделать несколько более простое, пошаговое описание того, что происходит:
Физические символы исходного файла отображаются, в соответствии с реализацией, в основной исходный набор символов [...]
Проблема кодирования файлов решена вручную;Стандарт заботится только об основном исходном наборе символов и оставляет место для реализации, чтобы туда добраться.
Любой символ исходного файла, не входящий в базовый исходный набор символов (2.3), заменяется универсальным символом-имя, обозначающее этот символ.
Основной исходный набор представляет собой простой список разрешенных символов. Это не ASCII (см. Далее).Все, чего нет в этом списке, «преобразуется» (по крайней мере, концептуально) в форму \uXXXX
.
Поэтому, независимо от того, какой тип литерала или кодировки файла используется, исходный код концептуально преобразуется в базовый символкомплект + куча \uXXXX
.Я говорю концептуально, потому что то, что фактически делают реализации, обычно проще, например, потому что они могут иметь дело с Unicode напрямую.Важной частью является то, что то, что Стандарт называет расширенным символом (то есть не из базового исходного набора), должно быть неотличимо в использовании от его эквивалентной формы \uXXXX
.Обратите внимание, что C ++ 03 доступен, например, на платформах EBCDIC, поэтому ваши рассуждения с точки зрения ASCII ошибочны с самого начала.
Наконец, описанный мной процесс также происходит с (не необработанными) строковыми литералами.Это означает, что ваш код эквивалентен, как если бы вы написали:
string utf8string a = u8"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf16string b = u"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf32string c = U"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";