Char Структура

Определение

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

public value class char : IComparable, IComparable<char>, IConvertible, IEquatable<char>
public value class char : IComparable, IComparable<char>, IConvertible, IEquatable<char>, ISpanFormattable
public value class char : IAdditionOperators<char, char, char>, IAdditiveIdentity<char, char>, IBinaryInteger<char>, IBinaryNumber<char>, IBitwiseOperators<char, char, char>, IComparable<char>, IComparisonOperators<char, char>, IConvertible, IDecrementOperators<char>, IDivisionOperators<char, char, char>, IEqualityOperators<char, char>, IEquatable<char>, IIncrementOperators<char>, IMinMaxValue<char>, IModulusOperators<char, char, char>, IMultiplicativeIdentity<char, char>, IMultiplyOperators<char, char, char>, INumber<char>, IParseable<char>, IShiftOperators<char, char>, ISpanParseable<char>, ISubtractionOperators<char, char, char>, IUnaryNegationOperators<char, char>, IUnaryPlusOperators<char, char>, IUnsignedNumber<char>
public value class char : IComparable, IConvertible
public value class char : IComparable, IComparable<char>, IEquatable<char>
public struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>
public readonly struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>
public readonly struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>, ISpanFormattable
public readonly struct Char : IAdditionOperators<char,char,char>, IAdditiveIdentity<char,char>, IBinaryInteger<char>, IBinaryNumber<char>, IBitwiseOperators<char,char,char>, IComparable<char>, IComparisonOperators<char,char>, IConvertible, IDecrementOperators<char>, IDivisionOperators<char,char,char>, IEqualityOperators<char,char>, IEquatable<char>, IIncrementOperators<char>, IMinMaxValue<char>, IModulusOperators<char,char,char>, IMultiplicativeIdentity<char,char>, IMultiplyOperators<char,char,char>, INumber<char>, IParseable<char>, IShiftOperators<char,char>, ISpanParseable<char>, ISubtractionOperators<char,char,char>, IUnaryNegationOperators<char,char>, IUnaryPlusOperators<char,char>, IUnsignedNumber<char>
[System.Serializable]
public struct Char : IComparable, IConvertible
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>
public struct Char : IComparable, IComparable<char>, IEquatable<char>
type char = struct
    interface IConvertible
type char = struct
    interface IConvertible
    interface ISpanFormattable
    interface IFormattable
type char = struct
    interface IConvertible
    interface ISpanFormattable
    interface IFormattable
    interface IBinaryInteger<char>
    interface IBinaryNumber<char>
    interface IBitwiseOperators<char, char, char>
    interface INumber<char>
    interface IAdditionOperators<char, char, char>
    interface IAdditiveIdentity<char, char>
    interface IComparisonOperators<char, char>
    interface IEqualityOperators<char, char>
    interface IDecrementOperators<char>
    interface IDivisionOperators<char, char, char>
    interface IIncrementOperators<char>
    interface IModulusOperators<char, char, char>
    interface IMultiplicativeIdentity<char, char>
    interface IMultiplyOperators<char, char, char>
    interface IParseable<char>
    interface ISpanParseable<char>
    interface ISubtractionOperators<char, char, char>
    interface IUnaryNegationOperators<char, char>
    interface IUnaryPlusOperators<char, char>
    interface IShiftOperators<char, char>
    interface IMinMaxValue<char>
    interface IUnsignedNumber<char>
[<System.Serializable>]
type char = struct
    interface IConvertible
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type char = struct
    interface IConvertible
type char = struct
Public Structure Char
Implements IComparable, IComparable(Of Char), IConvertible, IEquatable(Of Char)
Public Structure Char
Implements IComparable, IComparable(Of Char), IConvertible, IEquatable(Of Char), ISpanFormattable
Public Structure Char
Implements IAdditionOperators(Of Char, Char, Char), IAdditiveIdentity(Of Char, Char), IBinaryInteger(Of Char), IBinaryNumber(Of Char), IBitwiseOperators(Of Char, Char, Char), IComparable(Of Char), IComparisonOperators(Of Char, Char), IConvertible, IDecrementOperators(Of Char), IDivisionOperators(Of Char, Char, Char), IEqualityOperators(Of Char, Char), IEquatable(Of Char), IIncrementOperators(Of Char), IMinMaxValue(Of Char), IModulusOperators(Of Char, Char, Char), IMultiplicativeIdentity(Of Char, Char), IMultiplyOperators(Of Char, Char, Char), INumber(Of Char), IParseable(Of Char), IShiftOperators(Of Char, Char), ISpanParseable(Of Char), ISubtractionOperators(Of Char, Char, Char), IUnaryNegationOperators(Of Char, Char), IUnaryPlusOperators(Of Char, Char), IUnsignedNumber(Of Char)
Public Structure Char
Implements IComparable, IConvertible
Public Structure Char
Implements IComparable, IComparable(Of Char), IEquatable(Of Char)
Наследование
Атрибуты
Реализации

Примеры

В следующем примере кода демонстрируются некоторые методы в Char.

using namespace System;
int main()
{
   char chA = 'A';
   char ch1 = '1';
   String^ str =  "test string";
   Console::WriteLine( chA.CompareTo( 'B' ) ); // Output: "-1" (meaning 'A' is 1 less than 'B')
   Console::WriteLine( chA.Equals( 'A' ) ); // Output: "True"
   Console::WriteLine( Char::GetNumericValue( ch1 ) ); // Output: "1"
   Console::WriteLine( Char::IsControl( '\t' ) ); // Output: "True"
   Console::WriteLine( Char::IsDigit( ch1 ) ); // Output: "True"
   Console::WriteLine( Char::IsLetter( ',' ) ); // Output: "False"
   Console::WriteLine( Char::IsLower( 'u' ) ); // Output: "True"
   Console::WriteLine( Char::IsNumber( ch1 ) ); // Output: "True"
   Console::WriteLine( Char::IsPunctuation( '.' ) ); // Output: "True"
   Console::WriteLine( Char::IsSeparator( str, 4 ) ); // Output: "True"
   Console::WriteLine( Char::IsSymbol( '+' ) ); // Output: "True"
   Console::WriteLine( Char::IsWhiteSpace( str, 4 ) ); // Output: "True"
   Console::WriteLine( Char::Parse(  "S" ) ); // Output: "S"
   Console::WriteLine( Char::ToLower( 'M' ) ); // Output: "m"
   Console::WriteLine( 'x' ); // Output: "x"
}
using System;

public class CharStructureSample
{
    public static void Main()
    {
        char chA = 'A';
        char ch1 = '1';
        string str = "test string";

        Console.WriteLine(chA.CompareTo('B'));          //-----------  Output: "-1" (meaning 'A' is 1 less than 'B')
        Console.WriteLine(chA.Equals('A'));             //-----------  Output: "True"
        Console.WriteLine(Char.GetNumericValue(ch1));   //-----------  Output: "1"
        Console.WriteLine(Char.IsControl('\t'));        //-----------  Output: "True"
        Console.WriteLine(Char.IsDigit(ch1));           //-----------  Output: "True"
        Console.WriteLine(Char.IsLetter(','));          //-----------  Output: "False"
        Console.WriteLine(Char.IsLower('u'));           //-----------  Output: "True"
        Console.WriteLine(Char.IsNumber(ch1));          //-----------  Output: "True"
        Console.WriteLine(Char.IsPunctuation('.'));     //-----------  Output: "True"
        Console.WriteLine(Char.IsSeparator(str, 4));    //-----------  Output: "True"
        Console.WriteLine(Char.IsSymbol('+'));          //-----------  Output: "True"
        Console.WriteLine(Char.IsWhiteSpace(str, 4));   //-----------  Output: "True"
        Console.WriteLine(Char.Parse("S"));             //-----------  Output: "S"
        Console.WriteLine(Char.ToLower('M'));           //-----------  Output: "m"
        Console.WriteLine('x'.ToString());              //-----------  Output: "x"
    }
}
open System

let chA = 'A'
let ch1 = '1'
let str = "test string"

printfn $"{chA.CompareTo 'B'}"          //-----------  Output: "-1" (meaning 'A' is 1 less than 'B')
printfn $"{chA.Equals 'A'}"             //-----------  Output: "True"
printfn $"{Char.GetNumericValue ch1}"   //-----------  Output: "1"
printfn $"{Char.IsControl '\t'}"        //-----------  Output: "True"
printfn $"{Char.IsDigit ch1}"           //-----------  Output: "True"
printfn $"{Char.IsLetter ','}"          //-----------  Output: "False"
printfn $"{Char.IsLower 'u'}"           //-----------  Output: "True"
printfn $"{Char.IsNumber ch1}"          //-----------  Output: "True"
printfn $"{Char.IsPunctuation '.'}"     //-----------  Output: "True"
printfn $"{Char.IsSeparator(str, 4)}"   //-----------  Output: "True"
printfn $"{Char.IsSymbol '+'}"          //-----------  Output: "True"
printfn $"{Char.IsWhiteSpace(str, 4)}"  //-----------  Output: "True"
printfn $"""{Char.Parse "S"}"""         //-----------  Output: "S"
printfn $"{Char.ToLower 'M'}"           //-----------  Output: "m"
printfn $"{'x'}"                        //-----------  Output: "x"
Module CharStructure

    Public Sub Main()

        Dim chA As Char
        chA = "A"c
        Dim ch1 As Char
        ch1 = "1"c
        Dim str As String
        str = "test string"

        Console.WriteLine(chA.CompareTo("B"c))          ' Output: "-1" (meaning 'A' is 1 less than 'B')
        Console.WriteLine(chA.Equals("A"c))             ' Output: "True"
        Console.WriteLine(Char.GetNumericValue(ch1))    ' Output: "1"
        Console.WriteLine(Char.IsControl(Chr(9)))       ' Output: "True"
        Console.WriteLine(Char.IsDigit(ch1))            ' Output: "True"
        Console.WriteLine(Char.IsLetter(","c))          ' Output: "False"
        Console.WriteLine(Char.IsLower("u"c))           ' Output: "True"
        Console.WriteLine(Char.IsNumber(ch1))           ' Output: "True"
        Console.WriteLine(Char.IsPunctuation("."c))     ' Output: "True"
        Console.WriteLine(Char.IsSeparator(str, 4))     ' Output: "True"
        Console.WriteLine(Char.IsSymbol("+"c))          ' Output: "True"
        Console.WriteLine(Char.IsWhiteSpace(str, 4))    ' Output: "True"
        Console.WriteLine(Char.Parse("S"))              ' Output: "S"
        Console.WriteLine(Char.ToLower("M"c))           ' Output: "m"
        Console.WriteLine("x"c.ToString())              ' Output: "x"

    End Sub

End Module

Комментарии

.NET использует структуру Char для представления кодовых точек Юникода с помощью кодировки UTF-16. Значением объекта Char является его 16-разрядное числовое (порядковое) значение.

Если вы не знакомы с Юникодом, скалярными значениями, кодовых точек, суррогатными парами, UTF-16 и типом Rune , см. общие сведения о кодировке символов в .NET.

В следующих разделах рассматривается связь между объектами Char и символами, а также некоторые общие задачи, выполняемые с экземплярами Char. Рекомендуется рассмотреть Rune тип, представленный в .NET Core 3.0, в качестве альтернативы выполнению Char некоторых из этих задач.

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

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

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

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

    using System;
    using System.IO;
    
    public class Example
    {
       public static void Main()
       {
          StreamWriter sw = new StreamWriter("chars1.txt");
          char[] chars = { '\u0061', '\u0308' };
          string strng = new String(chars);
          sw.WriteLine(strng);
          sw.Close();
       }
    }
    // The example produces the following output:
    //       ä
    
    open System
    open System.IO
    
    let sw = new StreamWriter("chars1.txt")
    let chars = [| '\u0061'; '\u0308' |]
    let string = String chars
    sw.WriteLine string
    sw.Close()
    
    // The example produces the following output:
    //       ä
    
    Imports System.IO
    
    Module Example
       Public Sub Main()
          Dim sw As New StreamWriter("chars1.txt")
          Dim chars() As Char = { ChrW(&h0061), ChrW(&h0308) }
          Dim strng As New String(chars)
          sw.WriteLine(strng) 
          sw.Close()
       End Sub
    End Module
    ' The example produces the following output:
    '       ä
    
  • Символы вне основной многоязыковой плоскости Юникода (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.

    using System;
    using System.IO;
    
    public class Example
    {
       public static void Main()
       {
          StreamWriter sw = new StreamWriter(@".\chars2.txt");
          int utf32 = 0x1D160;
          string surrogate = Char.ConvertFromUtf32(utf32);
          sw.WriteLine("U+{0:X6} UTF-32 = {1} ({2}) UTF-16",
                       utf32, surrogate, ShowCodePoints(surrogate));
          sw.Close();
       }
    
       private static string ShowCodePoints(string value)
       {
          string retval = null;
          foreach (var ch in value)
             retval += String.Format("U+{0:X4} ", Convert.ToUInt16(ch));
    
          return retval.Trim();
       }
    }
    // The example produces the following output:
    //       U+01D160 UTF-32 = ð (U+D834 U+DD60) UTF-16
    
    open System
    open System.IO
    
    let showCodePoints (value: char seq) =
        let str =
            value
            |> Seq.map (fun ch -> $"U+{Convert.ToUInt16 ch:X4}")
            |> String.concat ""
        str.Trim()
    
    let sw = new StreamWriter(@".\chars2.txt")
    let utf32 = 0x1D160
    let surrogate = Char.ConvertFromUtf32 utf32
    sw.WriteLine $"U+{utf32:X6} UTF-32 = {surrogate} ({showCodePoints surrogate}) UTF-16"
    sw.Close()
    
    // The example produces the following output:
    //       U+01D160 UTF-32 = ð (U+D834 U+DD60) UTF-16
    
    Imports System.IO
    
    Module Example
       Public Sub Main()
          Dim sw As New StreamWriter(".\chars2.txt")
          Dim utf32 As Integer = &h1D160
          Dim surrogate As String = Char.ConvertFromUtf32(utf32)
          sw.WriteLine("U+{0:X6} UTF-32 = {1} ({2}) UTF-16", 
                       utf32, surrogate, ShowCodePoints(surrogate))
          sw.Close()                    
       End Sub
    
       Private Function ShowCodePoints(value As String) As String
          Dim retval As String = Nothing
          For Each ch In value
             retval += String.Format("U+{0:X4} ", Convert.ToUInt16(ch))
          Next
          Return retval.Trim()
       End Function
    End Module
    ' The example produces the following output:
    '       U+01D160 UTF-32 = ð (U+D834 U+DD60) UTF-16
    

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

Каждый символ Юникода или допустимая суррогатная пара принадлежит к определенной категории Юникода. В .NET категории Юникода представлены элементами UnicodeCategory перечисления и включают такие значения, как UnicodeCategory.CurrencySymbol, UnicodeCategory.LowercaseLetterи UnicodeCategory.SpaceSeparator, например,

Чтобы определить категорию Юникода символа, вызовите GetUnicodeCategory метод. В следующем примере GetUnicodeCategory используется для отображения категории Юникода каждого символа в строке. Пример работает правильно, только если в экземпляре String нет суррогатных пар.

using System;
using System.Globalization;

class Example
{
   public static void Main()
   {
      // Define a string with a variety of character categories.
      String s = "The red car drove down the long, narrow, secluded road.";
      // Determine the category of each character.
      foreach (var ch in s)
         Console.WriteLine("'{0}': {1}", ch, Char.GetUnicodeCategory(ch));
   }
}
// The example displays the following output:
//      'T': UppercaseLetter
//      'h': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'r': LowercaseLetter
//      'e': LowercaseLetter
//      'd': LowercaseLetter
//      ' ': SpaceSeparator
//      'c': LowercaseLetter
//      'a': LowercaseLetter
//      'r': LowercaseLetter
//      ' ': SpaceSeparator
//      'd': LowercaseLetter
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'v': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'd': LowercaseLetter
//      'o': LowercaseLetter
//      'w': LowercaseLetter
//      'n': LowercaseLetter
//      ' ': SpaceSeparator
//      't': LowercaseLetter
//      'h': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'l': LowercaseLetter
//      'o': LowercaseLetter
//      'n': LowercaseLetter
//      'g': LowercaseLetter
//      ',': OtherPunctuation
//      ' ': SpaceSeparator
//      'n': LowercaseLetter
//      'a': LowercaseLetter
//      'r': LowercaseLetter
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'w': LowercaseLetter
//      ',': OtherPunctuation
//      ' ': SpaceSeparator
//      's': LowercaseLetter
//      'e': LowercaseLetter
//      'c': LowercaseLetter
//      'l': LowercaseLetter
//      'u': LowercaseLetter
//      'd': LowercaseLetter
//      'e': LowercaseLetter
//      'd': LowercaseLetter
//      ' ': SpaceSeparator
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'a': LowercaseLetter
//      'd': LowercaseLetter
//      '.': OtherPunctuation
open System

// Define a string with a variety of character categories.
let s = "The red car drove down the long, narrow, secluded road."
// Determine the category of each character.
for ch in s do
    printfn $"'{ch}': {Char.GetUnicodeCategory ch}"

// The example displays the following output:
//      'T': UppercaseLetter
//      'h': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'r': LowercaseLetter
//      'e': LowercaseLetter
//      'd': LowercaseLetter
//      ' ': SpaceSeparator
//      'c': LowercaseLetter
//      'a': LowercaseLetter
//      'r': LowercaseLetter
//      ' ': SpaceSeparator
//      'd': LowercaseLetter
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'v': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'd': LowercaseLetter
//      'o': LowercaseLetter
//      'w': LowercaseLetter
//      'n': LowercaseLetter
//      ' ': SpaceSeparator
//      't': LowercaseLetter
//      'h': LowercaseLetter
//      'e': LowercaseLetter
//      ' ': SpaceSeparator
//      'l': LowercaseLetter
//      'o': LowercaseLetter
//      'n': LowercaseLetter
//      'g': LowercaseLetter
//      ',': OtherPunctuation
//      ' ': SpaceSeparator
//      'n': LowercaseLetter
//      'a': LowercaseLetter
//      'r': LowercaseLetter
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'w': LowercaseLetter
//      ',': OtherPunctuation
//      ' ': SpaceSeparator
//      's': LowercaseLetter
//      'e': LowercaseLetter
//      'c': LowercaseLetter
//      'l': LowercaseLetter
//      'u': LowercaseLetter
//      'd': LowercaseLetter
//      'e': LowercaseLetter
//      'd': LowercaseLetter
//      ' ': SpaceSeparator
//      'r': LowercaseLetter
//      'o': LowercaseLetter
//      'a': LowercaseLetter
//      'd': LowercaseLetter
//      '.': OtherPunctuation
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Define a string with a variety of character categories.
      Dim s As String = "The car drove down the narrow, secluded road."
      ' Determine the category of each character.
      For Each ch In s
         Console.WriteLine("'{0}': {1}", ch, Char.GetUnicodeCategory(ch)) 
      Next
   End Sub
End Module
' The example displays the following output:
'       'T': UppercaseLetter
'       'h': LowercaseLetter
'       'e': LowercaseLetter
'       ' ': SpaceSeparator
'       'r': LowercaseLetter
'       'e': LowercaseLetter
'       'd': LowercaseLetter
'       ' ': SpaceSeparator
'       'c': LowercaseLetter
'       'a': LowercaseLetter
'       'r': LowercaseLetter
'       ' ': SpaceSeparator
'       'd': LowercaseLetter
'       'r': LowercaseLetter
'       'o': LowercaseLetter
'       'v': LowercaseLetter
'       'e': LowercaseLetter
'       ' ': SpaceSeparator
'       'd': LowercaseLetter
'       'o': LowercaseLetter
'       'w': LowercaseLetter
'       'n': LowercaseLetter
'       ' ': SpaceSeparator
'       't': LowercaseLetter
'       'h': LowercaseLetter
'       'e': LowercaseLetter
'       ' ': SpaceSeparator
'       'l': LowercaseLetter
'       'o': LowercaseLetter
'       'n': LowercaseLetter
'       'g': LowercaseLetter
'       ',': OtherPunctuation
'       ' ': SpaceSeparator
'       'n': LowercaseLetter
'       'a': LowercaseLetter
'       'r': LowercaseLetter
'       'r': LowercaseLetter
'       'o': LowercaseLetter
'       'w': LowercaseLetter
'       ',': OtherPunctuation
'       ' ': SpaceSeparator
'       's': LowercaseLetter
'       'e': LowercaseLetter
'       'c': LowercaseLetter
'       'l': LowercaseLetter
'       'u': LowercaseLetter
'       'd': LowercaseLetter
'       'e': LowercaseLetter
'       'd': LowercaseLetter
'       ' ': SpaceSeparator
'       'r': LowercaseLetter
'       'o': LowercaseLetter
'       'a': LowercaseLetter
'       'd': LowercaseLetter
'       '.': OtherPunctuation

На внутреннем уровне для символов вне диапазона ASCII (от U+0000 до U+00FF) метод GetUnicodeCategory зависит от категорий Юникода, сообщаемых классом CharUnicodeInfo. Начиная с платформа .NET Framework 4.6.2 символы Юникода классифицируются на основе Стандарта Юникода версии 8.0.0. В версиях платформа .NET Framework от платформа .NET Framework 4 до платформа .NET Framework 4.6.1 они классифицируются на основе Стандарта Юникода версии 6.3.0.

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

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

using System;

public class Example
{
   public static void Main()
   {
      string result = String.Empty;
      for (int ctr = 0x10107; ctr <= 0x10110; ctr++)  // Range of Aegean numbers.
         result += Char.ConvertFromUtf32(ctr);

      Console.WriteLine("The string contains {0} characters.", result.Length);
   }
}
// The example displays the following output:
//     The string contains 20 characters.
open System

let result =
    [ for i in 0x10107..0x10110 do  // Range of Aegean numbers.
        Char.ConvertFromUtf32 i ]
    |> String.concat ""

printfn $"The string contains {result.Length} characters."


// The example displays the following output:
//     The string contains 20 characters.
Module Example
   Public Sub Main()
      Dim result As String = String.Empty
      For ctr As Integer = &h10107 To &h10110     ' Range of Aegean numbers.
         result += Char.ConvertFromUtf32(ctr)
      Next         
      Console.WriteLine("The string contains {0} characters.", result.Length) 
   End Sub
End Module
' The example displays the following output:
'     The string contains 20 characters.

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

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

  • Можно использовать String.EnumerateRunes , как показано в следующем примере:

    int CountLetters(string s)
    {
        int letterCount = 0;
    
        foreach (Rune rune in s.EnumerateRunes())
        {
            if (Rune.IsLetter(rune))
            { letterCount++; }
        }
    
        return letterCount;
    }
    
    let countLetters (s: string) =
        let mutable letterCount = 0
    
        for rune in s.EnumerateRunes() do
            if Rune.IsLetter rune then
                letterCount <- letterCount + 1
    
        letterCount
    
  • Можно использовать класс StringInfo для работы с элементами текста вместо отдельных объектов Char. В следующем примере для подсчета количества элементов текста в строке, состоящей из эгейских цифр от нуля до девяти, используется объект StringInfo. Так как он считает суррогатную пару одним символом, он правильно сообщает, что строка содержит десять символов.

    using System;
    using System.Globalization;
    
    public class Example
    {
       public static void Main()
       {
          string result = String.Empty;
          for (int ctr = 0x10107; ctr <= 0x10110; ctr++)  // Range of Aegean numbers.
             result += Char.ConvertFromUtf32(ctr);
    
          StringInfo si = new StringInfo(result);
          Console.WriteLine("The string contains {0} characters.",
                            si.LengthInTextElements);
       }
    }
    // The example displays the following output:
    //       The string contains 10 characters.
    
    open System
    open System.Globalization
    
    let result =
        [ for i in 0x10107..0x10110 do  // Range of Aegean numbers.
            Char.ConvertFromUtf32 i ]
        |> String.concat ""
    
    
    let si = StringInfo result
    printfn $"The string contains {si.LengthInTextElements} characters."
    
    // The example displays the following output:
    //       The string contains 10 characters.
    
    Imports System.Globalization
    
    Module Example
       Public Sub Main()
          Dim result As String = String.Empty
          For ctr As Integer = &h10107 To &h10110     ' Range of Aegean numbers.
             result += Char.ConvertFromUtf32(ctr)
          Next         
          Dim si As New StringInfo(result)
          Console.WriteLine("The string contains {0} characters.", si.LengthInTextElements) 
       End Sub
    End Module
    ' The example displays the following output:
    '       The string contains 10 characters.
    
  • Если строка содержит базовый символ с одним или несколькими несамостоятельными знаками, можно вызвать метод 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" с диэризисом).

    using System;
    
    public class Example
    {
       public static void Main()
       {
          string combining = "\u0061\u0308";
          ShowString(combining);
    
          string normalized = combining.Normalize();
          ShowString(normalized);
       }
    
       private static void ShowString(string s)
       {
          Console.Write("Length of string: {0} (", s.Length);
          for (int ctr = 0; ctr < s.Length; ctr++) {
             Console.Write("U+{0:X4}", Convert.ToUInt16(s[ctr]));
             if (ctr != s.Length - 1) Console.Write(" ");
          }
          Console.WriteLine(")\n");
       }
    }
    // The example displays the following output:
    //       Length of string: 2 (U+0061 U+0308)
    //
    //       Length of string: 1 (U+00E4)
    
    open System
    
    let showString (s: string) =
        printf $"Length of string: {s.Length} ("
        for i = 0 to s.Length - 1 do
            printf $"U+{Convert.ToUInt16 s[i]:X4}"
            if i <> s.Length - 1 then printf " "
        printfn ")\n"
    
    let combining = "\u0061\u0308"
    showString combining
    
    let normalized = combining.Normalize()
    showString normalized
    
    // The example displays the following output:
    //       Length of string: 2 (U+0061 U+0308)
    //
    //       Length of string: 1 (U+00E4)
    
    Module Example
       Public Sub Main()
          Dim combining As String = ChrW(&h0061) + ChrW(&h0308)
          ShowString(combining)
          
          Dim normalized As String = combining.Normalize()
          ShowString(normalized)
       End Sub
       
       Private Sub ShowString(s As String)
          Console.Write("Length of string: {0} (", s.Length)
          For ctr As Integer = 0 To s.Length - 1
             Console.Write("U+{0:X4}", Convert.ToUInt16(s(ctr)))
             If ctr <> s.Length - 1 Then Console.Write(" ")
          Next 
          Console.WriteLine(")")
          Console.WriteLine()
       End Sub
    End Module
    ' The example displays the following output:
    '       Length of string: 2 (U+0061 U+0308)
    '       
    '       Length of string: 1 (U+00E4)
    

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

Структура 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.
Преобразует символ в строке в объект Char Parse и TryParse
Преобразовать объект Char в объект <xref:System.String<xref:System.String> ToString
Изменение регистра объекта Char ToLower, ToLowerInvariant, ToUpper и ToUpperInvariant

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

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

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

Поля

MaxValue

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

MinValue

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

Методы

CompareTo(Char)

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

CompareTo(Object)

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

ConvertFromUtf32(Int32)

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

ConvertToUtf32(Char, Char)

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

ConvertToUtf32(String, Int32)

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

Equals(Char)

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

Equals(Object)

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

GetHashCode()

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

GetNumericValue(Char)

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

GetNumericValue(String, Int32)

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

GetTypeCode()

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

GetUnicodeCategory(Char)

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

GetUnicodeCategory(String, Int32)

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

IsAscii(Char)

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

IsControl(Char)

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

IsControl(String, Int32)

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

IsDigit(Char)

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

IsDigit(String, Int32)

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

IsHighSurrogate(Char)

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

IsHighSurrogate(String, Int32)

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

IsLetter(Char)

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

IsLetter(String, Int32)

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

IsLetterOrDigit(Char)

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

IsLetterOrDigit(String, Int32)

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

IsLower(Char)

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

IsLower(String, Int32)

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

IsLowSurrogate(Char)

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

IsLowSurrogate(String, Int32)

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

IsNumber(Char)

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

IsNumber(String, Int32)

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

IsPunctuation(Char)

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

IsPunctuation(String, Int32)

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

IsSeparator(Char)

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

IsSeparator(String, Int32)

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

IsSurrogate(Char)

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

IsSurrogate(String, Int32)

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

IsSurrogatePair(Char, Char)

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

IsSurrogatePair(String, Int32)

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

IsSymbol(Char)

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

IsSymbol(String, Int32)

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

IsUpper(Char)

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

IsUpper(String, Int32)

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

IsWhiteSpace(Char)

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

IsWhiteSpace(String, Int32)

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

Parse(String)

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

ToLower(Char)

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

ToLower(Char, CultureInfo)

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

ToLowerInvariant(Char)

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

ToString()

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

ToString(Char)

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

ToString(IFormatProvider)

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

ToUpper(Char)

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

ToUpper(Char, CultureInfo)

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

ToUpperInvariant(Char)

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

TryParse(String, Char)

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

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

IComparable.CompareTo(Object)

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

IConvertible.GetTypeCode()

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

IConvertible.ToBoolean(IFormatProvider)

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

IConvertible.ToByte(IFormatProvider)

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

IConvertible.ToChar(IFormatProvider)

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

IConvertible.ToDateTime(IFormatProvider)

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

IConvertible.ToDecimal(IFormatProvider)

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

IConvertible.ToDouble(IFormatProvider)

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

IConvertible.ToInt16(IFormatProvider)

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

IConvertible.ToInt32(IFormatProvider)

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

IConvertible.ToInt64(IFormatProvider)

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

IConvertible.ToSByte(IFormatProvider)

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

IConvertible.ToSingle(IFormatProvider)

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

IConvertible.ToString(IFormatProvider)

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

IConvertible.ToType(Type, IFormatProvider)

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

IConvertible.ToUInt16(IFormatProvider)

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

IConvertible.ToUInt32(IFormatProvider)

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

IConvertible.ToUInt64(IFormatProvider)

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

IFormattable.ToString(String, IFormatProvider)

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

ISpanFormattable.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)

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

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

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

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

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