C ++ 11: Пример различия между обычным строковым литералом и строковым литералом UTF-8?

Строковый литерал, который не начинается с префикса кодировки, является обычной строкой
буквально, и инициализируется с заданными символами.

Строковый литерал, который начинается с u8, например u8 «asdf», является строковым литералом UTF-8 и инициализируется заданными символами, закодированными в UTF-8.

Я не понимаю разницу между обычным строковым литералом и строковым литералом UTF-8.

Может ли кто-нибудь привести пример ситуации, когда они разные? (Вызвать другой вывод компилятора)

(Я имею в виду от POV стандарта, а не какой-либо конкретной реализации)

Каждый элемент исходного набора символов в символьном литерале или строковом литерале, а также каждый escape
последовательность и универсальное имя-символа в символьном литерале или не необработанном строковом литерале преобразуется в
соответствующий член набора символов выполнения.

5

Решение

Языки 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 ++.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]