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 : IComparable, IConvertible
public value class char : IComparable, IComparable<char>, IEquatable<char>
public struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>
public struct Char : IComparable, IComparable<char>, IConvertible, IEquatable<char>, ISpanFormattable
[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
[<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 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 编码来表示 Unicode 码位。 对象的值 Char 是其16位数字 (序号) 值。

如果你不熟悉 Unicode、标量值、代码点、代理项对、UTF-16 和 Rune 类型,请参阅 .net 中的字符编码简介

以下部分检查 Char 对象与字符之间的关系,并讨论使用实例执行的一些常见任务 Char 。 建议你考虑 Rune .Net Core 3.0 中引入的类型,作为执行某些任务的替代方法 Char

Char 对象、Unicode 字符和字符串

String对象是表示文本字符串的结构的有序集合 Char 。 大多数 Unicode 字符可以由单个 Char 对象表示,但是编码为基字符、代理项对和/或组合字符序列的字符由多个 Char 对象表示。 出于此原因, Char 对象中的结构 String 不一定等效于单个 Unicode 字符。

在以下情况下,多个16位代码单元用于表示单个 Unicode 字符:

  • 字形,可能包含单个字符或后跟一个或多个组合字符的基本字符。 例如,字符ä由 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:
    '       ä
    
  • Unicode 基本多语言平面 (BMP) 以外的字符。 Unicode 除了支持表示平面0的 BMP 外,还支持十六个平面。 Unicode 码位由包含平面的21位值用 UTF-32 表示。 例如,U + 1D160 表示音乐符号第8说明字符。 由于 UTF-16 编码只有16位,因此 BMP 外的字符由 UTF-16 中的代理项对表示。 下面的示例说明了32等效于 U + 1D160,即音乐符号第8注释字符,为 U + D834 U + DD60。 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
    

字符和字符类别

每个 Unicode 字符或有效代理项对属于一个 Unicode 类别。 在 .NET 中,Unicode 类别由枚举的成员表示, UnicodeCategory 并包含诸如 UnicodeCategory.CurrencySymbol 、和之类 UnicodeCategory.LowercaseLetter 的值 UnicodeCategory.SpaceSeparator

若要确定字符的 Unicode 类别,请调用 GetUnicodeCategory 方法。 例如,下面的示例调用 GetUnicodeCategory 以显示字符串中每个字符的 Unicode 类别。 仅当实例中没有代理项对时,此示例才能正常运行 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 方法取决于类报告的 Unicode 类别 CharUnicodeInfo 。 从 .NET Framework 4.6.2 开始,将根据unicode 标准版本 8.0.0对 unicode 字符进行分类。 在从 .NET Framework 4 到 .NET Framework 4.6.1 的 .NET Framework 版本中,将根据Unicode 标准6.3.0 版本对它们进行分类。

字符和文本元素

因为单个字符可由多个对象表示 Char ,所以,处理单个对象并不总是有意义的 Char 。 例如,下面的示例将表示爱琴大学数字0到9的 Unicode 码位转换为 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 对象计算字符串中的文本元素数,该字符串包含从零到9的爱琴大学数字。 由于它将代理项对视为单个字符,因此它会正确地报告该字符串包含十个字符。

    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 转换 (拉丁文小写字母 A) 并结合字符 u + 0308 (将分音符) 组合到 U + 00E4 (带有分音符) 的拉丁文小写字母 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 为另一种类型的对象,并确定对象的 Unicode 类别 Char

要执行此操作 使用这些 System.Char 方法
比较 Char 对象 CompareToEquals
将码位转换为字符串 ConvertFromUtf32

另请参阅 Rune 类型。
Char 对象或代理项对转换 Char 为码位 对于单个字符: Convert.ToInt32(Char)

对于代理项对或字符串中的字符: Char.ConvertToUtf32

另请参阅 Rune 类型。
获取字符的 Unicode 类别 GetUnicodeCategory

另请参阅 Rune.GetUnicodeCategory
确定字符是否在特定的 Unicode 类别中,如数字、字母、标点、控制字符等 IsControlIsDigitIsHighSurrogateIsLetterIsLetterOrDigitIsLowerIsLowSurrogateIsNumber IsPunctuation IsSeparator IsSurrogate IsSurrogatePair IsSymbol IsUpper 、、、、、、和 IsWhiteSpace

另请参阅类型上的对应方法 Rune
Char 表示数字的对象转换为数值类型 GetNumericValue

另请参阅 Rune.GetNumericValue
将字符串中的字符转换为 Char 对象 ParseTryParse
Char 对象转换为 String 对象 ToString
更改对象的大小写 Char ToLowerToLowerInvariantToUpperToUpperInvariant

另请参阅类型上的对应方法 Rune

Char 值和互操作

当托管 Char 类型(表示为 UNICODE utf-16 编码的代码单元)被传递到非托管代码时,互操作封送拆收器默认情况下将字符集转换为 ANSI。 可以将属性应用 DllImportAttribute 到平台调用声明,并将 StructLayoutAttribute 特性应用于 COM 互操作声明,以控制封送 Char 类型使用的字符集。

字段

MaxValue

表示 Char 的最大可能值。 此字段为常数。

MinValue

表示 Char 的最小可能值。 此字段为常数。

方法

CompareTo(Char)

将此实例与指定的 Char 对象进行比较,并指示此实例在排序顺序中是位于指定的 Char 对象之前、之后还是与其出现在同一位置。

CompareTo(Object)

将此实例与指定的对象进行比较,并指示此实例在排序顺序中是位于指定的 Object 之前、之后还是与其出现在同一位置。

ConvertFromUtf32(Int32)

将指定的 Unicode 码位转换为 UTF-16 编码字符串。

ConvertToUtf32(Char, Char)

将 UTF-16 编码的代理项对的值转换为 Unicode 码位。

ConvertToUtf32(String, Int32)

将字符串中指定位置的 UTF-16 编码字符或代理项对的值转换为 Unicode 码位。

Equals(Char)

返回一个值,该值指示此实例是否与指定的 Char 对象相等。

Equals(Object)

返回一个值,该值指示此实例是否与指定的对象相等。

GetHashCode()

返回此实例的哈希代码。

GetNumericValue(Char)

将指定的数字 Unicode 字符转换为双精度浮点数。

GetNumericValue(String, Int32)

将指定字符串中位于指定位置的数字 Unicode 字符转换为双精度浮点数。

GetTypeCode()

返回值类型 TypeCodeChar

GetUnicodeCategory(Char)

将指定的 Unicode 字符分类到由一个 UnicodeCategory 值标识的组中。

GetUnicodeCategory(String, Int32)

将指定字符串中位于指定位置的字符分类到由一个 UnicodeCategory 值标识的组中。

IsAscii(Char)

true如果 c 为 ASCII 字符 ( [u + 0000.. U + 007F] ) ,则返回。

IsControl(Char)

指示指定的 Unicode 字符是否属于控制字符类别。

IsControl(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于控制字符类别。

IsDigit(Char)

指示指定的 Unicode 字符是否属于十进制数字类别。

IsDigit(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于十进制数字类别。

IsHighSurrogate(Char)

指示指定的 Char 对象是否是一个高代理项。

IsHighSurrogate(String, Int32)

指示字符串中指定位置处的 Char 对象是否为高代理项。

IsLetter(Char)

指示指定的 Unicode 字符是否属于 Unicode 字母类别。

IsLetter(String, Int32)

指示指定字符串中位于指定位置处的指定字符串是否属于 Unicode 字母类别。

IsLetterOrDigit(Char)

指示指定的 Unicode 字符是否属于字母或十进制数字类别。

IsLetterOrDigit(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于字母或十进制数字类别。

IsLower(Char)

指示指定的 Unicode 字符是否属于小写字母类别。

IsLower(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于小写字母类别。

IsLowSurrogate(Char)

指示指定的 Char 对象是否是一个低代理项。

IsLowSurrogate(String, Int32)

指示字符串中指定位置处的 Char 对象是否为低代理项。

IsNumber(Char)

指示指定的 Unicode 字符是否属于数字类别。

IsNumber(String, Int32)

指示指定字符串中位于指定位置的字符是否属于数字类别。

IsPunctuation(Char)

指示指定的 Unicode 字符是否属于标点符号类别。

IsPunctuation(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于标点符号类别。

IsSeparator(Char)

指示指定的 Unicode 字符是否属于分隔符类别。

IsSeparator(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于分隔符类别。

IsSurrogate(Char)

指示指定的字符是否具有指定的代理项代码单位。

IsSurrogate(String, Int32)

指示指定字符串中位于指定位置的字符是否具有代理项代码单位。

IsSurrogatePair(Char, Char)

指示两个指定的 Char 对象是否形成一个代理项对。

IsSurrogatePair(String, Int32)

指示字符串中指定位置处的两个相邻 Char 对象是否形成一个代理项对。

IsSymbol(Char)

指示指定的 Unicode 字符是否属于符号字符类别。

IsSymbol(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于符号字符类别。

IsUpper(Char)

指示指定的 Unicode 字符是否属于大写字母类别。

IsUpper(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于大写字母类别。

IsWhiteSpace(Char)

指示指定的 Unicode 字符是否属于空格类别。

IsWhiteSpace(String, Int32)

指示指定字符串中位于指定位置处的字符是否属于空格类别。

Parse(String)

将指定字符串的值转换为它的等效 Unicode 字符。

ToLower(Char)

将 Unicode 字符的值转换为它的小写等效项。

ToLower(Char, CultureInfo)

使用指定的区域性特定格式设置信息将指定 Unicode 字符的值转换为它的小写等效项。

ToLowerInvariant(Char)

使用固定区域性的大小写规则,将 Unicode 字符的值转换为其小写等效项。

ToString()

将此实例的值转换为其等效的字符串表示形式。

ToString(Char)

将指定的 Unicode 字符转换为它的等效字符串表示形式。

ToString(IFormatProvider)

使用指定的区域性特定格式信息将此实例的值转换为它的等效字符串表示形式。

ToUpper(Char)

将 Unicode 字符的值转换为它的大写等效项。

ToUpper(Char, CultureInfo)

使用指定的区域性特定格式设置信息将指定 Unicode 字符的值转换为它的大写等效项。

ToUpperInvariant(Char)

使用固定区域性的大小写规则,将 Unicode 字符的值转换为其大写等效项。

TryParse(String, Char)

将指定字符串的值转换为它的等效 Unicode 字符。 一个指示转换是成功还是失败的返回代码。

显式接口实现

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)

尝试将当前实例的值设置为提供的字符范围格式。

适用于

线程安全性

此类型的所有成员都是线程安全的。 看似修改实例状态的成员实际上返回用新值初始化的新实例。 与任何其他类型一样,读取和写入包含此类型的实例的共享变量时,必须通过锁保护以保证线程安全。

另请参阅