System.Char yapısı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

Yapısı, Char UTF-16 kodlamasını kullanarak Unicode kod noktalarını temsil eder. Bir Char nesnenin değeri, 16 bit sayısal (sıralı) değeridir.

Unicode, skaler değerler, kod noktaları, vekil çiftleri, UTF-16 ve Rune türü hakkında bilginiz yoksa bkz . .NET'te karakter kodlamaya giriş.

Bu makalede bir Char nesne ile karakter arasındaki ilişki incelenerek örneklerle Char gerçekleştirilen bazı yaygın görevler ele alınıyor. .NET Core 3.0'da sunulan türü, bu görevlerden bazılarını gerçekleştirmeye Char alternatif olarak değerlendirmenizi Rune öneririz.

Char nesneleri, Unicode karakterleri ve dizeler

String Nesne, bir metin dizesini Char temsil eden sıralı bir yapı koleksiyonudur. Unicode karakterlerin çoğu tek Char bir nesneyle temsil edilebilir, ancak temel karakter, vekil çift ve/veya karakter dizisini birleştiren bir karakter birden çok Char nesne tarafından temsil edilir. Bu nedenle, nesnedeki bir CharString yapı tek bir Unicode karakteriyle eşdeğer olmayabilir.

Aşağıdaki durumlarda tek Unicode karakterlerini temsil etmek için birden çok 16 bit kod birimi kullanılır:

  • Tek bir karakterden veya bir temel karakterden ve ardından bir veya daha fazla birleştirme karakterinden oluşabilir. Örneğin, ğkarakteri, kod birimi U+0061 olan ve Char ardından kod birimi U+0308 olan bir Char nesneyle temsil edilir. (ğkarakteri, U+00E4 kod birimine sahip tek Char bir nesne tarafından da tanımlanabilir.) Aşağıdaki örnekte ğkarakterinin iki Char nesneden oluştuğu gösterilmektedir.

    using System;
    using System.IO;
    
    public class Example1
    {
        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 Example2
        Public Sub Main()
            Dim sw As New StreamWriter("chars1.txt")
            Dim chars() As Char = {ChrW(&H61), ChrW(&H308)}
            Dim strng As New String(chars)
            sw.WriteLine(strng)
            sw.Close()
        End Sub
    End Module
    ' The example produces the following output:
    '       ä
    
  • Unicode Temel Çok Dilli Düzlem (BMP) dışındaki karakterler. Unicode, 0 düzlemini temsil eden BMP'ye ek olarak on altı düzlemi destekler. Unicode kod noktası UTF-32'de düzlemi içeren 21 bit değerle temsil edilir. Örneğin U+1D160, MUSICAL SYMBOL EIGHTH NOTE karakterini temsil eder. UTF-16 kodlaması yalnızca 16 bit olduğundan, BMP dışındaki karakterler UTF-16'daki vekil çiftlerle temsil edilir. Aşağıdaki örnek, U+1D160'ın UTF-32 eşdeğeri olan MUSICAL SYMBOL EIGHTH NOTE karakterinin U+D834 U+DD60 olduğunu göstermektedir. U+D834 yüksek vekildir; U+D800 ile U+DBFF arasındaki yüksek yedekler. U+DD60 düşük vekildir; düşük vekiller U+DC00 ile U+DFFF arasında değişir.

    using System;
    using System.IO;
    
    public class Example3
    {
        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 Example4
        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
    

Karakterler ve karakter kategorileri

Her Unicode karakteri veya geçerli vekil çift bir Unicode kategorisine aittir. .NET'te Unicode kategorileri numaralandırmanın UnicodeCategory üyeleri tarafından temsil edilir ve örneğin , UnicodeCategory.LowercaseLetterve UnicodeCategory.SpaceSeparatorgibi UnicodeCategory.CurrencySymboldeğerler içerir.

Bir karakterin Unicode kategorisini belirlemek için yöntemini çağırın GetUnicodeCategory . Örneğin, aşağıdaki örnek bir dizedeki her karakterin Unicode kategorisini görüntülemek için öğesini çağırır GetUnicodeCategory . Örnek yalnızca örnekte vekil çiftler String yoksa düzgün çalışır.

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 Example1
    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

Dahili olarak, ASCII aralığının dışındaki karakterler için (U+0000 ile U+00FF) GetUnicodeCategory yöntemi, sınıfı tarafından CharUnicodeInfo bildirilen Unicode kategorilerine bağlıdır. .NET Framework 4.6.2'den başlayarak, Unicode karakterleri Unicode Standard, Sürüm 8.0.0'a göre sınıflandırılır. .NET Framework 4'ten .NET Framework 4.6.1'e kadar olan .NET Framework sürümlerinde, Bunlar Unicode Standard, Sürüm 6.3.0'a göre sınıflandırılır.

Karakterler ve metin öğeleri

Tek bir karakter birden çok Char nesneyle temsil edilebildiğinden, tek tek Char nesnelerle çalışmak her zaman anlamlı değildir. Örneğin aşağıdaki örnek, Ege sayılarını sıfırdan 9'a kadar temsil eden Unicode kod noktalarını UTF-16 kod birimlerine dönüştürür. Hatalı olarak nesneleri karakterlerle eşitlediğinden Char , sonuçta elde edilen dizenin 20 karakteri olduğunu yanlışlıkla bildirir.

using System;

public class Example5
{
    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 Example5
    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.

Bir nesnenin tek bir Char karakteri temsil ettiği varsayımını önlemek için aşağıdakileri yapabilirsiniz:

  • Dil içeriğini temsil etmek ve analiz etmek için tek tek karakterleriyle çalışmak yerine nesneyle String tamamen çalışabilirsiniz.

  • Aşağıdaki örnekte gösterildiği gibi kullanabilirsiniz 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
    
  • sınıfını StringInfo tek tek Char nesneler yerine metin öğeleriyle çalışmak için kullanabilirsiniz. Aşağıdaki örnek, sıfırdan dokuza kadar Ege sayılarından oluşan bir dizedeki metin öğelerinin sayısını saymak için nesnesini kullanır StringInfo . Bir vekil çiftini tek bir karakter olarak değerlendirdiğinden, dizenin on karakter içerdiğini doğru şekilde bildirir.

    using System;
    using System.Globalization;
    
    public class Example4
    {
        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 Example6
        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.
    
  • Dizede bir veya daha fazla birleştirme karakteri olan bir temel karakter varsa, alt dizeyi String.Normalize tek bir UTF-16 kodlanmış kod birimine dönüştürmek için yöntemini çağırabilirsiniz. Aşağıdaki örnek, U+0061 (LATIN KÜÇÜK A) temel karakterini dönüştürmek ve U+0308 karakterini (DIAERESIS BİRLEŞTİrME) U+00E4'e (LATIN KÜÇÜK HARF A VE AYRAÇ İLE) birleştirmek için yöntemini çağırır String.Normalize .

    using System;
    
    public class Example2
    {
        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 Example3
        Public Sub Main()
            Dim combining As String = ChrW(&H61) + ChrW(&H308)
            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)
    

Yaygın işlemler

Yapı Char , nesneleri karşılaştırmak Char , geçerli Char nesnenin değerini başka bir türdeki bir nesneye dönüştürmek ve nesnenin Char Unicode kategorisini belirlemek için yöntemler sağlar:

Bunu yapmak için Bu System.Char yöntemleri kullanın
Nesneleri karşılaştırma Char CompareTo ve Equals
Kod noktasını dizeye dönüştürme ConvertFromUtf32

Ayrıca türüne Rune de bakın.
Nesneyi Char veya vekil nesne çiftini Char kod noktasına dönüştürme Tek bir karakter için: Convert.ToInt32(Char)

Bir vekil çift veya dizedeki bir karakter için: Char.ConvertToUtf32

Ayrıca türüne Rune de bakın.
Bir karakterin Unicode kategorisini alma GetUnicodeCategory

Ayrıca Rune.GetUnicodeCategorybkz. .
Bir karakterin basamak, harf, noktalama işareti, denetim karakteri gibi belirli bir Unicode kategorisinde olup olmadığını belirleme IsControl, IsDigit, IsHighSurrogate, , IsLetter, IsLetterOrDigit, IsLower, IsLowSurrogate, , IsNumber, IsPunctuation, IsSeparator, , IsSurrogateIsSurrogatePair, IsSymbolIsUpperveIsWhiteSpace

Ayrıca türüyle ilgili yöntemlere Rune de bakın.
Sayıyı temsil eden bir Char nesneyi sayısal değer türüne dönüştürme GetNumericValue

Ayrıca Rune.GetNumericValuebkz. .
Dizedeki bir karakteri nesneye dönüştürme Char Parse ve TryParse
Nesneyi Char nesneye String dönüştürme ToString
Nesnenin büyük/küçük harflerini Char değiştirme ToLower, ToLowerInvariant, ToUpperve ToUpperInvariant

Ayrıca türüyle ilgili yöntemlere Rune de bakın.

Karakter değerleri ve birlikte çalışma

Unicode UTF-16 kodlanmış kod birimi olarak temsil edilen yönetilen Char bir tür yönetilmeyen koda geçirildiğinde, birlikte çalışma sıralayıcısı varsayılan olarak karakter kümesini ANSI'ye dönüştürür. Platform çağırma bildirimlerine özniteliğini DllImportAttribute ve StructLayoutAttribute bir COM birlikte çalışma bildirimine özniteliğini uygulayarak, sıralanmış Char türün hangi karakter kümesini kullandığını denetleyebilirsiniz.