Строковый литерал, который не начинается с префикса кодировки, является обычной строкой
буквально, и инициализируется с заданными символами.Строковый литерал, который начинается с u8, например u8 «asdf», является строковым литералом UTF-8 и инициализируется заданными символами, закодированными в UTF-8.
Я не понимаю разницу между обычным строковым литералом и строковым литералом UTF-8.
Может ли кто-нибудь привести пример ситуации, когда они разные? (Вызвать другой вывод компилятора)
(Я имею в виду от POV стандарта, а не какой-либо конкретной реализации)
Каждый элемент исходного набора символов в символьном литерале или строковом литерале, а также каждый escape
последовательность и универсальное имя-символа в символьном литерале или не необработанном строковом литерале преобразуется в
соответствующий член набора символов выполнения.
Языки C и C ++ допускают огромную свободу действий в своих реализациях. C был написан задолго до того, как UTF-8 стал «способом кодирования текста в одиночных байтах»: разные системы имели разные кодировки текста.
Так что значения байтов для строки в C и C ++ действительно зависят от компилятора. 'A'
независимо от того, какая кодировка выбрана для символа A
, который может не согласиться с UTF-8.
В C ++ добавлено требование, чтобы настоящие строковые литералы UTF-8 поддерживались компиляторами. Значение бита u8"A"[0]
фиксируется стандартом C ++ через стандарт UTF-8, независимо от предпочтительной кодировки платформы, на которую ориентирован компилятор.
Теперь, так как большинство платформ C ++ используют целые числа дополнения 2, большинство компиляторов имеют кодировки символов, которые в основном совместимы с UTF-8. Так что для строк, как "hello world"
, u8"hello world"
почти наверняка будет идентичным.
Для конкретного примера, из man gcc
-fexec-кодировка = кодировка
Установите набор символов выполнения, используемый для строковых и символьных констант. По умолчанию используется UTF-8. charset может быть любой кодировкой, поддерживаемой системной библиотекой iconv.
-finput-кодировка = кодировка
Установите входной набор символов, используемый для перевода из набора символов входного файла в исходный набор символов, используемый GCC. Если языковой стандарт не указан или GCC не может получить эту информацию из языкового стандарта, по умолчанию используется UTF-8. Это может быть отменено либо локалью, либо параметром командной строки. В настоящее время параметр командной строки имеет приоритет, если есть конфликт. charset может быть любой кодировкой, поддерживаемой системной библиотекой iconv.
пример того, как можно изменить исполняемые и входные наборы символов C / C ++.
Других решений пока нет …