Bagikan melalui


Struktur System.Char

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Struktur mewakili Char titik kode Unicode dengan menggunakan pengodean UTF-16. Nilai objek adalah Char nilai numerik 16-bit (ordinal).

Jika Anda tidak terbiasa dengan Unicode, nilai skalar, titik kode, pasangan pengganti, UTF-16, dan jenisnya Rune , lihat Pengenalan pengodean karakter di .NET.

Artikel ini memeriksa hubungan antara Char objek dan karakter dan membahas beberapa tugas umum yang dilakukan dengan Char instans. Kami menyarankan agar Anda mempertimbangkan jenisnya Rune , yang diperkenalkan di .NET Core 3.0, sebagai alternatif Char untuk melakukan beberapa tugas ini.

Objek karakter, karakter Unicode, dan string

Objek String adalah kumpulan Char struktur berurutan yang mewakili string teks. Sebagian besar karakter Unicode dapat diwakili oleh satu Char objek, tetapi karakter yang dikodekan sebagai karakter dasar, pasangan pengganti, dan/atau menggabungkan urutan karakter diwakili oleh beberapa Char objek. Untuk alasan ini, Char struktur dalam String objek tidak selalu setara dengan satu karakter Unicode.

Beberapa unit kode 16-bit digunakan untuk mewakili karakter Unicode tunggal dalam kasus berikut:

  • Glyph, yang mungkin terdiri dari satu karakter atau karakter dasar diikuti oleh satu atau beberapa karakter yang menggabungkan. Misalnya, karakter ä diwakili oleh Char objek yang unit kodenya adalah U+0061 diikuti oleh Char objek yang unit kodenya adalah U+0308. (Karakter ä juga dapat ditentukan oleh satu Char objek yang memiliki unit kode U+00E4.) Contoh berikut menggambarkan bahwa karakter ä terdiri dari dua Char objek.

    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:
    '       ä
    
  • Karakter di luar Unicode Basic Multilingual Plane (BMP). Unicode mendukung enam belas bidang selain BMP, yang mewakili bidang 0. Titik kode Unicode diwakili dalam UTF-32 dengan nilai 21-bit yang menyertakan bidang. Misalnya, U+1D160 mewakili karakter CATATAN MUSICAL SYMBOL EIGHTH. Karena pengodean UTF-16 hanya memiliki 16 bit, karakter di luar BMP diwakili oleh pasangan pengganti dalam UTF-16. Contoh berikut menggambarkan bahwa UTF-32 setara dengan U+1D160, karakter MUSICAL SYMBOL EIGHTH NOTE, adalah U+D834 U+DD60. U+D834 adalah pengganti tinggi; pengganti tinggi berkisar dari U+D800 hingga U+DBFF. U+DD60 adalah pengganti rendah; pengganti rendah berkisar dari U+DC00 hingga U+DFFF.

    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
    

Kategori karakter dan karakter

Setiap karakter Unicode atau pasangan pengganti yang valid termasuk dalam kategori Unicode. Dalam .NET, kategori Unicode diwakili oleh anggota UnicodeCategory enumerasi dan menyertakan nilai seperti UnicodeCategory.CurrencySymbol, , UnicodeCategory.LowercaseLetterdan UnicodeCategory.SpaceSeparator, misalnya.

Untuk menentukan kategori Unicode karakter, panggil GetUnicodeCategory metode . Misalnya, contoh berikut memanggil GetUnicodeCategory untuk menampilkan kategori Unicode dari setiap karakter dalam string. Contoh bekerja dengan benar hanya jika tidak ada pasangan pengganti dalam String instans.

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

Secara internal, untuk karakter di luar rentang ASCII (U+0000 hingga U+00FF), GetUnicodeCategory metode tergantung pada kategori Unicode yang CharUnicodeInfo dilaporkan oleh kelas. Dimulai dengan .NET Framework 4.6.2, karakter Unicode diklasifikasikan berdasarkan Standar Unicode, Versi 8.0.0. Dalam versi .NET Framework dari .NET Framework 4 hingga .NET Framework 4.6.1, mereka diklasifikasikan berdasarkan Standar Unicode, Versi 6.3.0.

Karakter dan elemen teks

Karena satu karakter dapat diwakili oleh beberapa Char objek, tidak selalu bermakna untuk bekerja dengan objek individual Char . Misalnya, contoh berikut mengonversi titik kode Unicode yang mewakili angka Aegean nol hingga 9 ke unit kode yang dikodekan UTF-16. Karena secara keliru menyamakan Char objek dengan karakter, string yang dihasilkan secara tidak akurat melaporkan bahwa string yang dihasilkan memiliki 20 karakter.

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.

Anda dapat melakukan hal berikut untuk menghindari asumsi bahwa Char objek mewakili satu karakter:

  • Anda dapat bekerja dengan String objek secara keseluruhan alih-alih bekerja dengan karakter individualnya untuk mewakili dan menganalisis konten linguistik.

  • Anda dapat menggunakan String.EnumerateRunes seperti yang ditunjukkan dalam contoh berikut:

    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
    
  • Anda dapat menggunakan StringInfo kelas untuk bekerja dengan elemen teks alih-alih objek individual Char . Contoh berikut menggunakan StringInfo objek untuk menghitung jumlah elemen teks dalam string yang terdiri dari angka Aegea nol hingga sembilan. Karena mempertimbangkan pasangan pengganti satu karakter, ia melaporkan dengan benar bahwa string berisi sepuluh karakter.

    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.
    
  • Jika string berisi karakter dasar yang memiliki satu atau beberapa karakter gabungan, Anda dapat memanggil String.Normalize metode untuk mengonversi substring ke satu unit kode yang dikodekan UTF-16. Contoh berikut memanggil String.Normalize metode untuk mengonversi karakter dasar U+0061 (LATIN SMALL LETTER A) dan menggabungkan karakter U+0308 (MENGGABUNGKAN DIAERESIS) ke U+00E4 (LATIN SMALL LETTER A WITH DIAERESIS).

    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)
    

Operasi umum

Struktur Char menyediakan metode untuk membandingkan Char objek, mengonversi nilai objek saat ini Char ke objek jenis lain, dan menentukan kategori Unicode objek Char :

Untuk melakukan ini Gunakan metode ini System.Char
Membandingkan Char objek CompareTo dan Equals
Mengonversi titik kode menjadi string ConvertFromUtf32

Lihat juga jenisnya Rune .
Char Mengonversi objek atau sepasang Char objek pengganti menjadi titik kode Untuk satu karakter: Convert.ToInt32(Char)

Untuk pasangan pengganti atau karakter dalam string: Char.ConvertToUtf32

Lihat juga jenisnya Rune .
Mendapatkan kategori Unicode karakter GetUnicodeCategory

Lihat juga Rune.GetUnicodeCategory.
Menentukan apakah karakter berada dalam kategori Unicode tertentu seperti digit, huruf, tanda baca, karakter kontrol, dan sebagainya IsControl, , IsDigit, IsLetterIsHighSurrogate, IsLetterOrDigit, IsLowerIsLowSurrogate, IsNumber, , IsPunctuation, IsSeparator, IsSurrogate, , IsSurrogatePair, IsSymbol, IsUpper, danIsWhiteSpace

Lihat juga metode yang sesuai pada jenisnya Rune .
Char Mengonversi objek yang mewakili angka menjadi tipe nilai numerik GetNumericValue

Lihat juga Rune.GetNumericValue.
Mengonversi karakter dalam string menjadi Char objek Parse dan TryParse
Char Mengonversi objek menjadi String objek ToString
Mengubah huruf besar/kecil Char objek ToLower, ToLowerInvariant, ToUpper, dan ToUpperInvariant

Lihat juga metode yang sesuai pada jenisnya Rune .

Nilai karakter dan interop

Ketika jenis terkelola Char , yang diwakili sebagai unit kode yang dikodekan Unicode UTF-16, diteruskan ke kode yang tidak dikelola, marshaller interop mengonversi karakter yang diatur ke ANSI secara default. Anda dapat menerapkan DllImportAttribute atribut ke deklarasi pemanggilan platform dan StructLayoutAttribute atribut ke deklarasi interop COM untuk mengontrol karakter mana yang mengatur jenis marshal yang Char digunakan.