Что обозначает char в с

Char Структура

Определение

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Представляет символ как кодовую единицу UTF-16.

Примеры

Комментарии

Объекты типа char, символы Юникода и строки

Объект String является упорядоченной коллекцией структур Char, представляющей строку текста. Большинство символов Юникода могут быть представлены одним объектом Char, но знак, который кодируется как базовый символ, суррогатная пара и/или последовательность несамостоятельных знаков представляется с помощью нескольких объектов Char. Поэтому структура Char в объекте String не обязательно эквивалентна одному символу Юникода.

Для представления одного символа Юникода используется несколько 16-разрядных кодовых единиц в следующих случаях:

Глифы, которые могут состоять из одного символа или базового символа со следующими за ним несамостоятельными знаками (одним или более). Например, символ ä представлен объектом Char с кодовой единицей U+0061, за которым следует объект Char с кодовой единицей U+0308. (Символ ä также может быть представлен как один объект Char с кодовой единицей U+00E4.) В следующем примере показано, что символ ä состоит из двух объектов Char.

Символы вне основной многоязыковой плоскости Юникода (BMP). Юникод поддерживает шестнадцать плоскостей помимо BMP, которая представляет плоскость 0. Кодовая точка Юникода в UTF-32 представляется 21-битовым значением, которое содержит плоскость. Например, U+1D160 представляет символ MUSICAL SYMBOL EIGHTH NOTE (музыкальный символ восьмая). Поскольку кодировка UTF-16 имеет только 16 разрядов, символы за пределами BMP в кодировке UTF-16 представляются суррогатными парами. В следующем примере показано, что U+D834 U+DD60 является эквивалентом U+1D160, символа MUSICAL SYMBOL EIGHTH NOTE, в UTF-32. U+D834 является старшим символом-заместителем; старшие символы-заместители находятся в диапазоне от U+D800 до U+DBFF. U+DD60 является младшим символом-заместителем; младшие символы-заместители находятся в диапазоне от U+DC00 до U+DFFF.

Символы и категории символов

Символы и текстовые элементы

Так как один символ может быть представлен несколькими объектами Char, не всегда имеет смысл работать с отдельными объектами Char. Например, в следующем примере кодовые точки Юникода, представляющие эгейские цифры 0–9, преобразуются в кодовые единицы в кодировке UTF-16. Так как в нем объекты Char ошибочно приравниваются к символам, он неточно сообщает, что результирующая строка содержит 20 символов.

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

Можно работать с объектом String целиком, а не с отдельными его символами, при представлении и анализе его лингвистического содержимого.

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

Если строка содержит базовый символ с одним или несколькими несамостоятельными знаками, можно вызвать метод String.Normalize для преобразования подстроки в одиночную кодовую единицу в кодировке UTF-16. В следующем примере метод String.Normalize используется для преобразования базового символа U+0061 (LATIN SMALL LETTER A — латинская строчная буква «a») и несамостоятельного знака U+0308 (COMBINING DIAERESIS — комбинируемое надстрочное двоеточие) в U+00E4 (LATIN SMALL LETTER A WITH DIAERESIS — латинская строчная буква «a» с диэризисом).

Типичные операции

Структура Char предоставляет методы для сравнения объектов Char, преобразования значения заданного объекта Char в объект другого типа и определения категории Юникода для объекта Char:

Требуемое действиеИспользуйте эти методы System.Char
Сравнение Char объектовCompareTo и Equals
Преобразование кодовой точки в строкуConvertFromUtf32

См. также Rune тип.

Преобразовать объект Char или суррогатную пару объектов Char в кодовую точкуДля одного символа: Convert.ToInt32(Char)

Для суррогатной пары или символа в строке: Char.ConvertToUtf32

См. также Rune тип.

Получение категории Юникода для символаGetUnicodeCategory

См. также раздел Rune.GetUnicodeCategory.

Определить, принадлежит ли символ определенной категории Юникода, например: цифры, буквы, знаки препинания, управляющие символы и т. д.IsControl, IsDigit, IsHighSurrogate, IsLetter, IsLetterOrDigit, IsLower, IsLowSurrogate, IsNumber, IsPunctuation, IsSeparator, IsSurrogate, IsSurrogatePair, IsSymbol, IsUpper и IsWhiteSpace

См. также соответствующие методы для Rune типа.

Преобразовать объект Char, который представляет число, в значение числового типаGetNumericValue

См. также раздел Rune.GetNumericValue.

Преобразует символ в строке в объект CharParse и TryParse
Преобразовать объект Char в объектToString
Изменение регистра объекта CharToLower, ToLowerInvariant, ToUpper и ToUpperInvariant

См. также соответствующие методы для Rune типа.

Значения Char и взаимодействие

Когда управляемый тип Char, который представляется как кодовая единица в кодировке Юникода UTF-16, передается в неуправляемый код, маршалер взаимодействия по умолчанию преобразует символы в кодировку ANSI. Можно применить атрибут DllImportAttribute к объявлениям вызова неуправляемого кода и атрибут StructLayoutAttribute к объявлениям COM-взаимодействия для управления набором символов, используемым при маршалинге типа Char.

Представляет наибольшее возможное значение типа Char. Это поле является константой.

Представляет минимально допустимое значение типа Char. Это поле является константой.

Методы

Сравнивает данный экземпляр с заданным объектом Char и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект Char.

Сравнивает данный экземпляр с заданным объектом и показывает, расположен ли данный экземпляр перед, после или на той же позиции в порядке сортировки, что и заданный объект Object.

Преобразует заданную кодовую точку Юникода в строку в кодировке UTF-16.

Преобразует значение суррогатной пары в кодировке UTF-16 в кодовую точку Юникода.

Преобразует значение символа в кодировке UTF-16 или суррогатную пару в заданной позиции в строке в кодовую точку Юникода.

Возвращает значение, указывающее, равен ли данный экземпляр указанному объекту Char.

Возвращает значение, показывающее, равен ли экземпляр указанному объекту.

Возвращает хэш-код данного экземпляра.

Преобразует указанный числовой символ Юникода в число двойной точности с плавающей запятой.

Преобразует числовой символ Юникода в указанной позиции в указанной строке в число двойной точности с плавающей запятой.

Возвращает TypeCode для типа значения Char.

Относит указанный символ Юникода к группе, определенной одним из значений UnicodeCategory.

Относит символ Юникода в указанной позиции к группе, определенной одним из значений UnicodeCategory.

Возвращает, true Если c является символом ASCII ([U + 0000.. U + 007F]).

Показывает, относится ли указанный символ Юникода к категории управляющих символов.

Показывает, относится ли символ в указанной позиции в указанной строке к категории управляющих символов.

Показывает, относится ли указанный символ Юникода к категории десятичных цифр.

Показывает, относится ли указанный символ Юникода в указанной позиции в указанной строке к категории десятичных цифр.

Определяет, является ли заданный объект Char старшим символом-заместителем.

Определяет, является ли объект Char в заданной позиции в строке старшим символом-заместителем.

Показывает, относится ли указанный символ Юникода к категории букв Юникода.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории букв Юникода.

Показывает, относится ли указанный символ Юникода к категории букв или десятичных цифр.

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

Показывает, относится ли указанный символ Юникода к категории букв нижнего регистра.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории букв нижнего регистра.

Определяет, является ли заданный объект Char младшим символом-заместителем.

Определяет, является ли объект Char в заданной позиции в строке младшим символом-заместителем.

Показывает, относится ли указанный символ Юникода к категории цифр.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории цифр.

Показывает, относится ли указанный символ Юникода к категории знаков препинания.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории знаков препинания.

Показывает, относится ли указанный символ Юникода к категории знаков-разделителей.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории знаков-разделителей.

Указывает, имеет ли заданный символ заменяющую кодовую единицу.

Указывает, имеет ли указанный символ в указанной позиции в указанной строке заменяющую кодовую единицу.

Определяет, образуют ли два заданных объекта Char суррогатную пару.

Определяет, образуют ли два смежных объекта Char в заданной позиции в строке суррогатную пару.

Показывает, относится ли указанный символ Юникода к категории символьных знаков.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории символьных знаков.

Показывает, относится ли указанный символ Юникода к категории букв верхнего регистра.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории букв верхнего регистра.

Показывает, относится ли указанный символ Юникода к категории пробелов.

Показывает, относится ли указанный символ в указанной позиции в указанной строке к категории пробелов.

Преобразует значение указанной строки в эквивалентный символ Юникода.

Преобразует значение символа Юникода в его эквивалент в нижнем регистре.

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

Преобразует значение символа Юникода в его эквивалент в нижнем регистре, используя правила изменения регистра, связанные с инвариантным языком и региональными параметрами.

Преобразует значение этого экземпляра в эквивалентное ему строковое представление.

Преобразует указанный символ Юникода в эквивалентное ему строковое представление.

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

Преобразует значение символа Юникода в эквивалентный символ верхнего регистра.

Преобразует значение указанного символа Юникода в его эквивалент в верхнем регистре, используя указанные сведения о форматировании, связанные с языком и региональными параметрами.

Преобразует значение символа Юникода в его эквивалент в верхнем регистре, используя правила изменения регистра, связанные с инвариантным языком и региональными параметрами.

Преобразует значение указанной строки в эквивалентный символ Юникода. Возвращает код, позволяющий определить, успешно ли выполнено преобразование.

Явные реализации интерфейса

Сравнивает текущий экземпляр с другим объектом того же типа и возвращает целое число, которое показывает, расположен ли текущий экземпляр перед, после или на той же позиции в порядке сортировки, что и другой объект.

Возвращает TypeCode для этого экземпляра.

Примечание. Это преобразование не поддерживается. Попытка его выполнения приводит к созданию исключения InvalidCastException.

Описание этого члена см. в разделе ToByte(IFormatProvider).

Описание этого члена см. в разделе ToChar(IFormatProvider).

Примечание. Это преобразование не поддерживается. Попытка его выполнения приводит к созданию исключения InvalidCastException.

Примечание. Это преобразование не поддерживается. Попытка его выполнения приводит к созданию исключения InvalidCastException.

Примечание. Это преобразование не поддерживается. Попытка его выполнения приводит к созданию исключения InvalidCastException.

Описание этого члена см. в разделе ToInt16(IFormatProvider).

Описание этого члена см. в разделе ToInt32(IFormatProvider).

Описание этого члена см. в разделе ToInt64(IFormatProvider).

Описание этого члена см. в разделе ToSByte(IFormatProvider).

Примечание. Это преобразование не поддерживается. Попытка его выполнения приводит к созданию исключения InvalidCastException.

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

Описание этого члена см. в разделе ToType(Type, IFormatProvider).

Описание этого члена см. в разделе ToUInt16(IFormatProvider).

Описание этого члена см. в разделе ToUInt32(IFormatProvider).

Описание этого члена см. в разделе ToUInt64(IFormatProvider).

Форматирует значение текущего экземпляра, используя указанный формат.

Пытается отформатировать значение текущего экземпляра в указанный диапазон символов.

Применяется к

Потокобезопасность

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

Источник

Строковые и символьные литералы (C++)

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

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

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

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

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

Кодирование

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

Символьный литерал, начинающийся с 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\b
двойная кавычка
Возврат каретки\r
нуль-символ\0
Смена страницы\f
восьмеричный\ooo
оповещение (колокольчик)\a
шестнадцатеричный\xhhh

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

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

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

Чтобы создать значение из короткого многосимвольного литерала, компилятор преобразует символ или последовательность символов между одинарными кавычками в 8-битные значения в пределах 32-разрядного целого числа. Несколько символов в литерале заполняют соответствующие байты по мере необходимости от высокого до низкого порядка. Затем компилятор преобразует целое число в целевой тип после обычных правил. Например, чтобы создать char значение, компилятор принимает байт нижнего порядка. Для создания значения wchar_t или char16_t компилятор принимает младшее слово. Компилятор выдает предупреждение о том, что результат усекается, если какие-либо биты заданы выше назначенного байта или слова.

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

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

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

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

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

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

В символьных литералах и машинных (не являющихся необработанными) строковых литералах любой символ может быть представлен универсальным именем символа. Универсальные имена символов формируются с помощью префикса, \U за которым следует 8-значная кодовая точка Юникода или префикс, \u за которым следует 4-значная кодовая точка Юникода. Все восемь или четыре знака, соответственно, должны присутствовать для создания корректного универсального имени символа.

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

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

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

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

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

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

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

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 от Бьерна Страуструпа).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *