Escape символ это

Обновлено: 07.07.2024

В C++ поддерживаются различные типы строк и символов, а также доступны различные способы выражения значений литералов каждого из этих типов. В исходном коде содержимое символьных и строковых литералов выражается с помощью кодировки. Универсальные имена символов и escape-символы позволяют представить любую строку, используя только основную кодировку исходного кода. Необработанные строковые литералы позволяют не использовать escape-символы и могут применяться для выражения всех типов строковых литералов. Можно также создавать std::string литералы без необходимости выполнения дополнительных действий по созданию или преобразованию.

Строковые литералы могут не иметь префикса или включать префиксы u8 , L , u и U для обозначения кодировок обычных символов (однобайтовых или многобайтовых), UTF-8, расширенных символов (UCS-2 или UTF-16), UTF-16 и UTF-32, соответственно. Необработанный строковый литерал может иметь R u8R LR префиксы. uR и UR для необработанных эквивалентов этих кодировок. Чтобы создать временные или статические std::string значения, можно использовать строковые литералы или необработанные строковые литералы с s суффиксом. Дополнительные сведения см. в разделе строковые литералы ниже. Дополнительные сведения о базовой кодировке исходного кода, универсальных именах символов и использовании символов из расширенных кодовых страниц в исходном коде см. в разделе наборы символов.

Строковые литералы

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

Узкие строковые литералы

Узким строковым литералом является нефиксированный, разделенный символами двойной кавычки массив типа const char[n] , где n — это длина массива в байтах. Обычный строковый литерал может содержать любые графические символы, за исключением двойных кавычек ( " ), обратной косой черты ( \ ) или символа новой строки. Обычный строковый литерал также может содержать перечисленные выше escape-последовательности и универсальные имена символов, которые помещаются в байте.

Строки в кодировке UTF-8

Строка в кодировке UTF-8 — это U8 с двойной кавычкой, разделенный нулем массив типа const char[n] , где n — это длина закодированного массива в байтах. Строковый литерал с префиксом u8 может содержать любые графические символы, за исключением двойных кавычек ( " ), обратной косой черты ( \ ) или символа новой строки. Строковый литерал с префиксом u8 может также содержать перечисленные выше escape-последовательности и любые универсальные имена символов.

Широкие строковые литералы

Широкий строковый литерал — это массив констант, заканчивающийся нулем wchar_t , который имеет префикс " L " и содержит любой графический символ, кроме двойных кавычек ( " ), обратной косой черты ( \ ) или символа новой строки. Расширенный строковый литерал может содержать перечисленные выше escape-последовательности и любые универсальные имена символов.

char16_t и char32_t (C++11)

В c++ 11 введены переносимые char16_t (16-разрядные Юникод) и char32_t (32-разрядные Юникод) символы типа:

Необработанные строковые литералы (C++ 11)

Необработанный строковый литерал — это массив с завершающим нулем (любой символьный тип), содержащий любой графический символ, включая двойные кавычки ( " ), обратную косую черту ( \ ) или символ новой строки. Необработанные строковые литералы часто применяются в регулярных выражениях, которые используют классы символов, а также в строках HTML и XML. Примеры см. в следующей статье: Bjarne Stroustrup's FAQ on C++11(Вопросы и ответы о C++11 от Бьерна Страуструпа).

Разделитель — это определяемая пользователем последовательность длиной до 16 символов, которая непосредственно предшествует открывающей скобке необработанного строкового литерала и сразу после закрывающей скобки. Например, в R"abc(Hello"\()abc" последовательность разделителей — abc , а содержимое строки — Hello"\( . Разделители можно использовать для различения необработанных строк, содержащих двойные кавычки и круглые скобки. Этот строковый литерал вызывает ошибку компилятора:

Однако ошибку можно устранить с помощью разделителя:

Можно создать необработанный строковый литерал, содержащий символ новой строки (не экранированный символ) в источнике:

литералы std:: String (C++ 14)

std::string литералы являются реализациями определяемых пользователем литералов в стандартной библиотеке (см. ниже), которые представлены как "xyz"s (с s суффиксом). Этот тип строкового литерала создает временный объект типа std::string , std::wstring , std::u32string или std::u16string , в зависимости от указанного префикса. Если префикс не используется, то создается std::string . L"xyz"s создает std::wstring . u"xyz"s создает std:: u16stringи U"xyz"s создает std:: u32string.

s Суффикс можно также использовать для необработанных строковых литералов:

std::string литералы определяются в пространстве имен std::literals::string_literals в <string> файле заголовка. Поскольку std::literals::string_literals и std::literals объявляются как встроенные пространства имен, std::literals::string_literals автоматически обрабатывается так, как если бы он принадлежал непосредственно в пространстве имен std .

Размер строковых литералов

Для char* строк ANSI и других однобайтовых кодировок (но не UTF-8) размер строкового литерала (в байтах) — это число символов плюс 1 для завершающего нуль-символа. Для всех других типов строк размер не строго связан с числом символов. UTF-8 использует до четырех char элементов для кодирования некоторых единиц кода, а char16_t или wchar_t кодирования UTF-16 может использовать два элемента (всего четыре байта) для кодирования одной единицы кода. В примере ниже показан размер расширенного строкового литерала в байтах.

Обратите внимание, что strlen() и wcslen() не включайте размер завершающего нуль-символа, размер которого равен размеру элемента строкового типа: один байт в char* char8_t* строке или, два байта wchar_t* или char16_t* строки и четыре байта в char32_t* строках.

Максимальная длина строкового литерала составляет 65 535 байт. Это ограничение применимо как к узким, так и к расширенным строковым литералам.

Изменение строковых литералов

Поскольку строковые литералы (не включая std::string литералы) являются константами, попытка их изменить, например, str[2] = 'A' приводит к ошибке компилятора.

Специально для систем Майкрософт

В Microsoft C++ можно использовать строковый литерал для инициализации указателя на не-const char или wchar_t . Эта неконстантная инициализация разрешена в коде C99, но не рекомендуется в C++ 98 и удалена в C++ 11. Попытка изменить строку вызовет нарушение прав доступа, как показано в следующем примере:

Если задать параметр компилятора /Zc:strictStrings (отключить преобразование типов строковых литералов) , то при преобразовании строкового литерала в указатель неконстантного символа компилятор может выдать ошибку. Рекомендуется использовать его для создания переносимого кода, соответствующего стандартам. Также рекомендуется использовать auto ключевое слово для объявления инициализированных указателей строкового литерала, так как он разрешается в правильный (const) тип. В следующем примере кода перехватывается во время компиляции попытка записать в строковый литерал:

В некоторых случаях идентичные строковые литералы могут быть объединены в пул для экономии места в исполняемом файле. При объединении строковых литералов в пулы компилятор делает так, что все ссылки на определенный строковый литерал указывают на одну и ту же область в памяти, вместо того чтобы каждая ссылка указывала на отдельный экземпляр строкового литерала. Чтобы включить объединение строк, используйте /GF параметр компилятора.

Раздел, относящийся к корпорации Майкрософт , заканчивается здесь.

Сцепление смежных строковых литералов

Все смежные расширенные и узкие строковые литералы соединяются. Данное объявление:

идентично следующему объявлению:

и следующему объявлению:

Использование внедренных шестнадцатеричных escape-кодов для задания строковых литералов может привести к непредвиденным результатам. В следующем примере выполняется попытка создать строковый литерал, содержащий символ ASCII 5, за которым следуют символы f, i, v и e:

Фактический результат (шестнадцатеричное значение 5F) является кодом ASCII для символа подчеркивания, за которым следуют символы i, v и e. Чтобы получить правильный результат, можно использовать одну из следующих escape-последовательностей:

std::string литералы, так как они std::string являются типами, могут быть объединены с + оператором, определенным для basic_string типов. Эти литералы также можно соединить аналогично смежным строковым литералам. В обоих случаях кодировка строки и суффикс должны совпадать:

Строковые литералы с универсальными именами символов

Машинные (не являющиеся необработанными) строковые литералы могут использовать универсальные имена символов для представления любого символа, при условии что универсальные имена можно кодировать как один или несколько символов в строковом типе. Например, универсальное имя символа, представляющее расширенный символ, не может быть закодировано в виде короткой строки с помощью кодовой страницы ANSI, но может быть закодировано в виде узких строк в некоторых многобайтовых кодовых страницах или в строках UTF-8 или в расширенной строке. В C++ 11 Поддержка Юникода расширена с помощью char16_t* char32_t* строковых типов и.

Обратная косая черта (\) в регулярном выражении может означать следующее.

Следующий за ней символ является специальным, как показано в таблице в следующем разделе. Например, \b — это привязка, указывающая, что сопоставление регулярного выражения должно начинаться на границе слова, \t представляет знак табуляции, а \x020 соответствует пробелу.

Escape-символы распознаются в шаблонах регулярных выражений, но не в шаблонах замены.

Escape-знаки в NET

Пример

В приведенном ниже примере показано использование escape-последовательностей в регулярном выражении. В нем анализируется строка, содержащая названия крупнейших городов мира и их население в 2009 г. Название каждого города отделено от его населения символом табуляции ( \t ) или вертикальной чертой (| или \u007c ). Отдельные города и их население разделяются символами возврата каретки и перевода строки.

Возможные интерпретации регулярного выражения \G(.+)[\t\u007c](.+)\r?\n показаны в следующей таблице.


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

Большинство символов можно просто набрать с клавиатуры и использовать в коде PHP в их исходном виде. Например, $string = "php.watch" - это полностью допустимая строка в PHP, а $num = 42 - допустимое число. Также можно использовать многобайтные символы (для хранения которых требуется более одного байта), например, этот совершенно допустимый эмодзи: $emoji = "?" .

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

Что касается чисел, PHP поддерживает стандартные десятичные числа, но также может использовать и другие нотиции, такие как двоичное, восьмеричное, шестнадцатеричное и даже научное (scientific) представление. Они могут сделать код более читаемым и понятным в зависимости от контекста.

Двойные кавычки и Heredoc

В PHP строка с двойными кавычками ( "string" ) или Heredoc (смотрите ниже) поддерживает escape-последовательности и интерполяцию переменных.

PHP будет пытаться интерполировать переменные, если строковый литерал находится внутри строки с двойными кавычками или Heredoc.

Альтернативно (и желательно) интерполируемые переменные могут быть выделены фигурными скобками, так они будут выглядеть более удобочитаемыми:

Строки в одинарных кавычках ( 'string' ) и синтаксис Nowdoc не интерполируют переменные:

Только строки в двойных кавычках и Heredoc поддерживают escape-символы.

Экранирование символов

Поскольку PHP интерпретирует и интерполирует специальные символы внутри строковых литералов в двойных кавычках и heredoc, знак обратной косой черты ( \ ) используется как «escape-символ».

Например, использование \$name вместо $name не даст PHP интерполировать переменную $name .

Использование второго символа обратной косой черты предотвращает преобразование первого символа обратной косой черты в escape-символ.

PHP поддерживает несколько специальных escape-последовательностей для специальных символов. В приведенном выше примере \$ считается escape-последовательностью, потому что он отменяет интерполяцию PHP, заставляя PHP буквально использовать символ $ .

Символы табуляции: \t и \v

Возможно, самые простой из управляющих символов - это символ табуляции. Символ табуляции (по нажатию клавиши tab) можно использовать внутри строкового литерала, но использование \t вместо визуального пропуска делает его наглядным. Использование \t вместо буквального символа табуляции также позволяет избежать автоматической замены символов табуляции на пробелы в различных IDE.

\v - это вертикальная табуляция. На поддерживаемых терминалах символ вертикальной табуляции переходит к следующему символу в следующей строке:

Новые строки: \r и \n

\r («возврат каретки») и \n («перевод строки») являются символами новой строки.

Исторически так сложилось, что различные системы начали использовать либо \r , либо \n , и даже Windows использует \r\n . Например, Linux и MacOS по умолчанию используют символ «перевода строки» ( \n ) в качестве символа новой строки, тогда как Windows использует комбинацию \r\n (возврат каретки, за которым следует перевод строки). Старые системы MacOS использовали в качестве символа новой строки \r .

PHP имеет константу PHP_EOL , которая всегда ссылается на системный символ новой строки.

Escape-символ: \e

Escape-символы часто используется для отправки управляющих последовательностей ANSI в терминал. Например, \e , за которым следует [32m , указывает терминалу изменить цвет на зеленый, а [33m - на желтый.

Если приведенный выше фрагмент выполняется в терминале, который поддерживает управляющие последовательности ANSI, он интерпретирует его и изменяет текст:


Символ новой страницы: \f

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

Восьмеричные escape-последовательности символов ASCII

PHP поддерживает экранирование восьмеричного числа в его соответствующий ASCII символ.

Например, ASCII символ P равен 80 в десятичной системе (смотрите диаграмму). 80 из десятичной системы счисления в переводе в восьмеричную - 120 .

Для символа P можно использовать восьмеричную escape-последовательность:

Любой базовый символ ASCII можно представить с помощью такой записи:

Любое значение в диапазоне от \0 до \377 будет интерпретироваться как восьмеричная escape-последовательность ASCII символа.

Обратите внимание, что числа для расширенных символов ASCII (от 128 до 255) несовместимы с UTF-8. PHP считает значение 128 (восьмеричное: 200 ; шестнадцатеричное: 80 ) недопустимым, поскольку оно не является допустимым значением UTF-8.

Хотя PHP принимает такие значения, они считаются недопустимыми символами в контексте UTF-8.

Шестнадцатеричные escape-последовательности символов ASCII

Подобно восьмеричным escape-последовательностям символов, PHP также допускает использование шестнадцатеричных чисел в escape-последовательности символов с префиксом \x .

Допускается только один байт, что подразумевает допустимый диапазон от x0 до xFF . Однако ограничение UTF-8 по-прежнему присутствует, и только значения до x80 будут считаться допустимыми символами.

Кроме того, шестнадцатеричные символы не чувствительны к регистру (т.е. AF равно af и aF ).

ASCII P - 80, что равно x50 :

Тот же "PHP.Watch" пример можно переписать с помощью шестнадцатеричных escape-последовательностей:

Escape-последовательности символов Unicode

PHP поддерживает использование любого Unicode символа с префиксом \u и шестнадцатеричным значением code point внутри фигурных скобок.

PHP выдаст ошибку парсера, если символ Unicode превышает значение 10FFFF :

10FFFF является верхним пределом, потому что спецификация UTF-8 объявляет диапазон от U+0000 до U+10FFFF .

В предыдущей версии этой статьи верхний предел неверно упоминался как FFFFF , что было исправлено на 10FFFF . Спасибо Саре Големон за то, что она указала на это.

Форму записи Unicode \u<> можно использовать качестве escape-последовательности для любого символа. Вот несколько примеров:


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

Большинство символов можно просто набрать с клавиатуры и использовать в коде PHP в их исходном виде. Например, $string = "php.watch" - это полностью допустимая строка в PHP, а $num = 42 - допустимое число. Также можно использовать многобайтные символы (для хранения которых требуется более одного байта), например, этот совершенно допустимый эмодзи: $emoji = "?" .

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

Что касается чисел, PHP поддерживает стандартные десятичные числа, но также может использовать и другие нотиции, такие как двоичное, восьмеричное, шестнадцатеричное и даже научное (scientific) представление. Они могут сделать код более читаемым и понятным в зависимости от контекста.

Двойные кавычки и Heredoc

В PHP строка с двойными кавычками ( "string" ) или Heredoc (смотрите ниже) поддерживает escape-последовательности и интерполяцию переменных.

PHP будет пытаться интерполировать переменные, если строковый литерал находится внутри строки с двойными кавычками или Heredoc.

Альтернативно (и желательно) интерполируемые переменные могут быть выделены фигурными скобками, так они будут выглядеть более удобочитаемыми:

Строки в одинарных кавычках ( 'string' ) и синтаксис Nowdoc не интерполируют переменные:

Только строки в двойных кавычках и Heredoc поддерживают escape-символы.

Экранирование символов

Поскольку PHP интерпретирует и интерполирует специальные символы внутри строковых литералов в двойных кавычках и heredoc, знак обратной косой черты ( \ ) используется как «escape-символ».

Например, использование \$name вместо $name не даст PHP интерполировать переменную $name .

Использование второго символа обратной косой черты предотвращает преобразование первого символа обратной косой черты в escape-символ.

PHP поддерживает несколько специальных escape-последовательностей для специальных символов. В приведенном выше примере \$ считается escape-последовательностью, потому что он отменяет интерполяцию PHP, заставляя PHP буквально использовать символ $ .

Символы табуляции: \t и \v

Возможно, самые простой из управляющих символов - это символ табуляции. Символ табуляции (по нажатию клавиши tab) можно использовать внутри строкового литерала, но использование \t вместо визуального пропуска делает его наглядным. Использование \t вместо буквального символа табуляции также позволяет избежать автоматической замены символов табуляции на пробелы в различных IDE.

\v - это вертикальная табуляция. На поддерживаемых терминалах символ вертикальной табуляции переходит к следующему символу в следующей строке:

Новые строки: \r и \n

\r («возврат каретки») и \n («перевод строки») являются символами новой строки.

Исторически так сложилось, что различные системы начали использовать либо \r , либо \n , и даже Windows использует \r\n . Например, Linux и MacOS по умолчанию используют символ «перевода строки» ( \n ) в качестве символа новой строки, тогда как Windows использует комбинацию \r\n (возврат каретки, за которым следует перевод строки). Старые системы MacOS использовали в качестве символа новой строки \r .

PHP имеет константу PHP_EOL , которая всегда ссылается на системный символ новой строки.

Escape-символ: \e

Escape-символы часто используется для отправки управляющих последовательностей ANSI в терминал. Например, \e , за которым следует [32m , указывает терминалу изменить цвет на зеленый, а [33m - на желтый.

Если приведенный выше фрагмент выполняется в терминале, который поддерживает управляющие последовательности ANSI, он интерпретирует его и изменяет текст:


Символ новой страницы: \f

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

Восьмеричные escape-последовательности символов ASCII

PHP поддерживает экранирование восьмеричного числа в его соответствующий ASCII символ.

Например, ASCII символ P равен 80 в десятичной системе (смотрите диаграмму). 80 из десятичной системы счисления в переводе в восьмеричную - 120 .

Для символа P можно использовать восьмеричную escape-последовательность:

Любой базовый символ ASCII можно представить с помощью такой записи:

Любое значение в диапазоне от \0 до \377 будет интерпретироваться как восьмеричная escape-последовательность ASCII символа.

Обратите внимание, что числа для расширенных символов ASCII (от 128 до 255) несовместимы с UTF-8. PHP считает значение 128 (восьмеричное: 200 ; шестнадцатеричное: 80 ) недопустимым, поскольку оно не является допустимым значением UTF-8.

Хотя PHP принимает такие значения, они считаются недопустимыми символами в контексте UTF-8.

Шестнадцатеричные escape-последовательности символов ASCII

Подобно восьмеричным escape-последовательностям символов, PHP также допускает использование шестнадцатеричных чисел в escape-последовательности символов с префиксом \x .

Допускается только один байт, что подразумевает допустимый диапазон от x0 до xFF . Однако ограничение UTF-8 по-прежнему присутствует, и только значения до x80 будут считаться допустимыми символами.

Кроме того, шестнадцатеричные символы не чувствительны к регистру (т.е. AF равно af и aF ).

ASCII P - 80, что равно x50 :

Тот же "PHP.Watch" пример можно переписать с помощью шестнадцатеричных escape-последовательностей:

Escape-последовательности символов Unicode

PHP поддерживает использование любого Unicode символа с префиксом \u и шестнадцатеричным значением code point внутри фигурных скобок.

PHP выдаст ошибку парсера, если символ Unicode превышает значение 10FFFF :

10FFFF является верхним пределом, потому что спецификация UTF-8 объявляет диапазон от U+0000 до U+10FFFF .

В предыдущей версии этой статьи верхний предел неверно упоминался как FFFFF , что было исправлено на 10FFFF . Спасибо Саре Големон за то, что она указала на это.

Форму записи Unicode \u<> можно использовать качестве escape-последовательности для любого символа. Вот несколько примеров:

Символьные литералы

Символьный литерал состоит из символьной константы. Он представляется символом, заключенным в одинарные кавычки. Существует пять типов символьных литералов:

Обычные символьные литералы типа char , например 'a'

Символьные литералы UTF-8 типа char ( char8_t в c++ 20), например u8'a'

Литералы с расширенными символами типа wchar_t , например L'a'

Символьные литералы UTF-16 типа char16_t , например u'a'

UTF-32 символьные литералы типа char32_t , например U'a'

Символ, используемый для символьного литерала, может быть любым символом, за исключением символов обратной косой черты ( \ ), одинарной кавычки ( ' ) или новой строки. Зарезервированные символы можно указывать с помощью escape-последовательности. Символы можно указывать с помощью универсальных имен символов, при условии что тип является достаточно крупным для размещения символа.

Кодирование

Символьные литералы кодируются по-разному в соответствии с их префиксом.

Символьный литерал без префикса является обычным символьным литералом. Значение обычного символьного литерала, содержащего один символ, escape-последовательность или универсальное имя символа, которое может быть представлено в наборе символов выполнения, имеет значение, равное числовому значению его кодировки в наборе символов выполнения. Обычный символьный литерал, содержащий более одного символа, escape-последовательности или универсального имени символа, является многосимвольным литералом. Многосимвольный литерал или обычный символьный литерал, который не может быть представлен в наборе символов выполнения int , имеет тип, а его значение определяется реализацией. дополнительные MSVC см. в разделе, относящемся к корпорации майкрософт ниже.

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

Символьный литерал, начинающийся с u8 префикса, является символьным литералом UTF-8. Значение символьного литерала UTF-8, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено в одной единице кода UTF-8 (соответствующее элементам управления C0 и основному регистру символов латиницы). Если значение не может быть представлено одной единицей кода UTF-8, программа неправильно сформирована. Символьный литерал в кодировке UTF-8, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с u префикса, является символьным литералом UTF-16. Значение символьного литерала UTF-16, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению его кодовой точки ISO 10646, если оно может быть представлено одной единицей кода UTF-16 (соответствующей базовой многоязыковой плоскости). Если значение не может быть представлено одной единицей кода UTF-16, программа неправильно сформирована. Символьный литерал UTF-16, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Символьный литерал, начинающийся с U префикса, является символьным литералом UTF-32. Значение символьного литерала UTF-32, содержащего один символ, escape-последовательность или универсальное имя символа, имеет значение, равное значению кодовой точки ISO 10646. Символьный литерал в кодировке UTF-32, содержащий более одного символа, escape-последовательности или универсального имени символа, имеет неправильный формат.

Escape-последовательности

Существует три вида escape-последовательностей: простая, восьмеричная и шестнадцатеричная. Escape-последовательностями могут быть следующие значения:

Значение Escape-последовательность
новая строка \n
обратная косая черта \\
горизонтальная табуляция \t
вопросительный знак ? или \?
вертикальная табуляция \v
одинарная кавычка \'
BACKSPACE \&
двойная кавычка \"
Возврат каретки \Cерверный
нуль-символ \0
Смена страницы
восьмеричный \OOO
оповещение (колокольчик) \a
шестнадцатеричный \ксххх

Восьмеричная escape-последовательность — это обратная косая черта, за которой следует последовательность из одной до трех восьмеричных цифр. Восьмеричная escape-последовательность завершается на первом символе, который не является восьмеричной цифрой, если он встречается раньше, чем третья цифра. Наибольшее возможное восьмеричное значение — \377 .

Шестнадцатеричная escape-последовательность — это обратная косая черта, за которой следует символ x , за которым следует последовательность из одной или нескольких шестнадцатеричных цифр. Начальные нули пропускаются. В обычном или U8 символьном литерале самое высокое шестнадцатеричное значение — 0xFF. В расширенном символьном литерале с префиксом L или u максимальное шестнадцатеричное значение — 0xFFFF. В расширенном символьном литерале с префиксом U максимальное шестнадцатеричное значение — 0xFFFFFFFF.

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

Обратная косая черта ( \ ) — это символ продолжения строки, когда он помещается в конец строки. Если требуется, чтобы символ обратной косой черты отображался в виде символьного литерала, необходимо ввести две обратные косые черты в строке ( \\ ). Дополнительные сведения о символе продолжения строки см. в разделе Phases of Translation.

Специально для систем Майкрософт

Восьмеричная escape-последовательность, которая содержит более трех цифр, рассматривается как восьмеричная последовательность из 3 цифр, за которой следуют последующие цифры как символы в многосимвольном литерале, что может привести к неудивительному результату. Пример:

Escape-последовательности, которые содержат невосьмеричные символы, вычисляются в виде восьмеричной последовательности вплоть до последнего восьмеричного символа, за которыми следуют оставшиеся символы в виде последующих символов в многосимвольном литерале. Предупреждение C4125 создается, если первый невосьмеричный символ является десятичной цифрой. Пример:

Восьмеричная escape-последовательность, которая имеет большее значение, чем \377 Ошибка C2022: "значение-in-Decimal": слишком большое для символа.

Escape-последовательность, которая содержит шестнадцатеричные и нешестнадцатеричные символы, вычисляется как многосимвольный литерал, содержащий шестнадцатеричную escape-последовательность вплоть до последнего шестнадцатеричного символа, за которыми следуют нешестнадцатеричные символы. Шестнадцатеричная escape-последовательность, которая не содержит шестнадцатеричных цифр, приводит к ошибке компилятора C2153: "шестнадцатеричные литералы должны содержать по крайней мере одну шестнадцатеричную цифру".

Если в расширенном символьном литерале с префиксом L содержится последовательность из множества символов, значение берется из первого символа, а компилятор выдает предупреждение C4066. Последующие символы игнорируются, в отличие от поведения эквивалентного обычного многосимвольного литерала.

Раздел, относящийся к корпорации Майкрософт , заканчивается здесь.

Универсальные имена символов

Суррогатные пары

Универсальные имена символов не могут кодировать значения в суррогатном диапазоне кодовых точек D800-DFFF. Для суррогатных пар Юникода укажите универсальное имя символа, используя \UNNNNNNNN , где NNNNNNNN — восьмизначная кодовая точка для символа. При необходимости компилятор создает суррогатную пару.

В C++03 языком допускалось, чтобы универсальными именами символов представлялось лишь определенное подмножество символов. Также могли существовать универсальные имена символов, не представляющие никаких допустимых символов Юникода. Эта ошибка была исправлена в стандарте C++ 11. В C++11 в символьных и строковых литералах и идентификаторах можно использовать универсальные имена символов. Дополнительные сведения об универсальных именах символов см. в разделе Character Sets. Дополнительные сведения о Юникоде см. в статье Unicode. Дополнительные сведения о суррогатных парах см. в статье Surrogate Pairs and Supplementary Characters(Суррогатные пары и дополнительные символы).

Читайте также: