使用英语阅读

通过


Encoding.GetCharCount 方法

定义

在派生类中重写时,计算对字节序列进行解码所产生的字符数。

重载

GetCharCount(Byte[])

在派生类中重写时,计算对指定字节数组中的所有字节进行解码所产生的字符数。

GetCharCount(ReadOnlySpan<Byte>)

在派生类中重写时,计算对提供的只读字节范围进行解码所产生的字符数。

GetCharCount(Byte*, Int32)

在派生类中重写时,计算对字节序列(从指定的字节指针开始)进行解码所产生的字符数。

GetCharCount(Byte[], Int32, Int32)

在派生类中重写时,计算对字节序列(从指定字节数组开始)进行解码所产生的字符数。

GetCharCount(Byte[])

Source:
Encoding.cs
Source:
Encoding.cs
Source:
Encoding.cs

在派生类中重写时,计算对指定字节数组中的所有字节进行解码所产生的字符数。

C#
public virtual int GetCharCount (byte[] bytes);

参数

bytes
Byte[]

包含要解码的字节序列的字节数组。

返回

对指定字节序列进行解码所产生的字符数。

例外

bytesnull

发生回退(有关详细信息,请参阅采用 .NET 的字符编码

-和-

DecoderFallback 设置为 DecoderExceptionFallback

示例

下面的示例将字符串编码为一个字节数组,然后将这些字节解码为一个字符数组。

C#
using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Encoding u32LE = Encoding.GetEncoding( "utf-32" );
      Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );

      // Use a string containing the following characters:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      String myStr = "za\u0306\u01FD\u03B2";

      // Encode the string using the big-endian byte order.
      byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
      u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );

      // Encode the string using the little-endian byte order.
      byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
      u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );

      // Get the char counts, and decode the byte arrays.
      Console.Write( "BE array with BE encoding : " );
      PrintCountsAndChars( barrBE, u32BE );
      Console.Write( "LE array with LE encoding : " );
      PrintCountsAndChars( barrLE, u32LE );
   }

   public static void PrintCountsAndChars( byte[] bytes, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-25} :", enc.ToString() );

      // Display the exact character count.
      int iCC  = enc.GetCharCount( bytes );
      Console.Write( " {0,-3}", iCC );

      // Display the maximum character count.
      int iMCC = enc.GetMaxCharCount( bytes.Length );
      Console.Write( " {0,-3} :", iMCC );

      // Decode the bytes and display the characters.
      char[] chars = enc.GetChars( bytes );
      Console.WriteLine( chars );
   }
}


/* 
This code produces the following output.  The question marks take the place of characters that cannot be displayed at the console.

BE array with BE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ
LE array with LE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ

*/

注解

若要计算存储所生成的字符所需的确切数组大小 GetChars(Byte[]) ,应使用 GetCharCount(Byte[]) 方法。 若要计算最大数组大小,应使用 GetMaxCharCount(Int32) 方法。 GetCharCount(Byte[])方法通常允许分配较少的内存,而 GetMaxCharCount 方法的执行速度通常更快。

GetCharCount(Byte[])方法确定多少个字符会导致对一个字节序列进行解码,并且该 GetChars(Byte[]) 方法执行实际解码。 Encoding.GetChars方法需要分离转换,这与方法不同, Decoder.GetChars 后者处理单个输入流上的多个传递。

支持和的多个版本 GetCharCountGetChars 。 下面是有关使用这些方法的一些编程注意事项:

  • 您的应用程序可能需要从代码页解码多个输入字节,并使用多个调用处理这些字节。 在这种情况下,可能需要在调用之间维护状态。

  • 如果你的应用程序处理字符串输出,则应使用 GetString 方法。 由于此方法必须检查字符串长度并分配一个缓冲区,因此它稍慢一些,但生成的 String 类型是首选的。

  • 的字节版本 GetChars(Byte*, Int32, Char*, Int32) 允许一些快速的方法,尤其是对大缓冲区的多个调用。 但请记住,此方法版本有时不安全,因为指针是必需的。

  • 如果你的应用程序必须转换大量数据,则应重新使用输出缓冲区。 在这种情况下, GetChars(Byte[], Int32, Int32, Char[], Int32) 支持输出字符缓冲区的版本是最佳选择。

  • 请考虑使用 Decoder.Convert 方法而不是 GetCharCount 。 转换方法尽可能多地转换数据,如果输出缓冲区太小,则会引发异常。 对于流的连续解码,此方法通常是最佳选择。

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

GetCharCount(ReadOnlySpan<Byte>)

Source:
Encoding.cs
Source:
Encoding.cs
Source:
Encoding.cs

在派生类中重写时,计算对提供的只读字节范围进行解码所产生的字符数。

C#
public virtual int GetCharCount (ReadOnlySpan<byte> bytes);

参数

bytes
ReadOnlySpan<Byte>

要解码的只读字节范围。

返回

对字节范围进行解码所产生的字符数。

注解

若要计算 GetChars 存储所生成的字符所需的确切数组大小,应使用 GetCharCount 方法。 若要计算最大数组大小,请使用 GetMaxCharCount 方法。 GetCharCount方法通常允许分配较少的内存,而 GetMaxCharCount 方法的执行速度通常更快。

GetCharCount方法确定多少个字符会导致对一个字节序列进行解码,并且该 GetChars 方法执行实际解码。 GetChars方法需要分离转换,这与方法不同, Decoder.GetChars 后者处理单个输入流上的多个传递。

支持和的多个版本 GetCharCountGetChars 。 下面是有关使用这些方法的一些编程注意事项:

  • 您的应用程序可能需要从代码页解码多个输入字节,并使用多个调用处理这些字节。 在这种情况下,可能需要在调用之间维护状态。

  • 如果你的应用程序处理字符串输出,则建议使用 GetString 方法。 由于此方法必须检查字符串长度并分配一个缓冲区,因此它稍慢一些,但生成的 String 类型是首选的。

  • 如果你的应用程序必须转换大量数据,则应重新使用输出缓冲区。 在这种情况下, GetChars(Byte[], Int32, Int32, Char[], Int32) 支持输出字符缓冲区的版本是最佳选择。

  • 请考虑使用 Decoder.Convert 方法而不是 GetCharCount 。 转换方法尽可能多地转换数据,如果输出缓冲区太小,则会引发异常。 对于流的连续解码,此方法通常是最佳选择。

适用于

.NET 9 和其他版本
产品 版本
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

GetCharCount(Byte*, Int32)

Source:
Encoding.cs
Source:
Encoding.cs
Source:
Encoding.cs

重要

此 API 不符合 CLS。

在派生类中重写时,计算对字节序列(从指定的字节指针开始)进行解码所产生的字符数。

C#
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetCharCount (byte* bytes, int count);
C#
[System.CLSCompliant(false)]
public virtual int GetCharCount (byte* bytes, int count);
C#
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetCharCount (byte* bytes, int count);
C#
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetCharCount (byte* bytes, int count);

参数

bytes
Byte*

指向第一个要解码的字节的指针。

count
Int32

要解码的字节数。

返回

对指定字节序列进行解码所产生的字符数。

属性

例外

bytesnull

count 小于零。

发生回退(有关详细信息,请参阅采用 .NET 的字符编码

-和-

DecoderFallback 设置为 DecoderExceptionFallback

注解

若要计算 GetChars 存储所生成的字符所需的确切数组大小,应使用 GetCharCount 方法。 若要计算最大数组大小,请使用 GetMaxCharCount 方法。 GetCharCount方法通常允许分配较少的内存,而 GetMaxCharCount 方法的执行速度通常更快。

GetCharCount方法确定多少个字符会导致对一个字节序列进行解码,并且该 GetChars 方法执行实际解码。 GetChars方法需要分离转换,这与方法不同, Decoder.GetChars 后者处理单个输入流上的多个传递。

支持和的多个版本 GetCharCountGetChars 。 下面是有关使用这些方法的一些编程注意事项:

  • 您的应用程序可能需要从代码页解码多个输入字节,并使用多个调用处理这些字节。 在这种情况下,可能需要在调用之间维护状态。

  • 如果你的应用程序处理字符串输出,则建议使用 GetString 方法。 由于此方法必须检查字符串长度并分配一个缓冲区,因此它稍慢一些,但生成的 String 类型是首选的。

  • 的字节版本 GetChars(Byte*, Int32, Char*, Int32) 允许一些快速的方法,尤其是对大缓冲区的多个调用。 但请记住,此方法版本有时不安全,因为指针是必需的。

  • 如果你的应用程序必须转换大量数据,则应重新使用输出缓冲区。 在这种情况下, GetChars(Byte[], Int32, Int32, Char[], Int32) 支持输出字符缓冲区的版本是最佳选择。

  • 请考虑使用 Decoder.Convert 方法而不是 GetCharCount 。 转换方法尽可能多地转换数据,如果输出缓冲区太小,则会引发异常。 对于流的连续解码,此方法通常是最佳选择。

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

GetCharCount(Byte[], Int32, Int32)

Source:
Encoding.cs
Source:
Encoding.cs
Source:
Encoding.cs

在派生类中重写时,计算对字节序列(从指定字节数组开始)进行解码所产生的字符数。

C#
public abstract int GetCharCount (byte[] bytes, int index, int count);

参数

bytes
Byte[]

包含要解码的字节序列的字节数组。

index
Int32

第一个要解码的字节的索引。

count
Int32

要解码的字节数。

返回

对指定字节序列进行解码所产生的字符数。

例外

bytesnull

indexcount 小于零。

indexcount 不表示 bytes 中的有效范围。

发生回退(有关详细信息,请参阅采用 .NET 的字符编码

-和-

DecoderFallback 设置为 DecoderExceptionFallback

示例

下面的示例将字符串从一种编码转换为另一种编码。

C#
using System;
using System.Text;

class Example
{
   static void Main()
   {
      string unicodeString = "This string contains the unicode character Pi (\u03a0)";

      // Create two different encodings.
      Encoding ascii = Encoding.ASCII;
      Encoding unicode = Encoding.Unicode;

      // Convert the string into a byte array.
      byte[] unicodeBytes = unicode.GetBytes(unicodeString);

      // Perform the conversion from one encoding to the other.
      byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
         
      // Convert the new byte[] into a char[] and then into a string.
      char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
      ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
      string asciiString = new string(asciiChars);

      // Display the strings created before and after the conversion.
      Console.WriteLine("Original string: {0}", unicodeString);
      Console.WriteLine("Ascii converted string: {0}", asciiString);
   }
}
// The example displays the following output:
//    Original string: This string contains the unicode character Pi (Π)
//    Ascii converted string: This string contains the unicode character Pi (?)

下面的示例将字符串编码为一个字节数组,然后将一系列字节解码为字符数组。

C#
using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Encoding u32LE = Encoding.GetEncoding( "utf-32" );
      Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );

      // Use a string containing the following characters:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      String myStr = "za\u0306\u01FD\u03B2";

      // Encode the string using the big-endian byte order.
      byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
      u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );

      // Encode the string using the little-endian byte order.
      byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
      u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );

      // Get the char counts, decode eight bytes starting at index 0,
      // and print out the counts and the resulting bytes.
      Console.Write( "BE array with BE encoding : " );
      PrintCountsAndChars( barrBE, 0, 8, u32BE );
      Console.Write( "LE array with LE encoding : " );
      PrintCountsAndChars( barrLE, 0, 8, u32LE );
   }

   public static void PrintCountsAndChars( byte[] bytes, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-25} :", enc.ToString() );

      // Display the exact character count.
      int iCC  = enc.GetCharCount( bytes, index, count );
      Console.Write( " {0,-3}", iCC );

      // Display the maximum character count.
      int iMCC = enc.GetMaxCharCount( count );
      Console.Write( " {0,-3} :", iMCC );

      // Decode the bytes and display the characters.
      char[] chars = enc.GetChars( bytes, index, count );

      // The following is an alternative way to decode the bytes:
      // char[] chars = new char[iCC];
      // enc.GetChars( bytes, index, count, chars, 0 );

      Console.WriteLine( chars );
   }
}


/* 
This code produces the following output.  The question marks take the place of characters that cannot be displayed at the console.

BE array with BE encoding : System.Text.UTF32Encoding : 2   6   :za
LE array with LE encoding : System.Text.UTF32Encoding : 2   6   :za

*/

注解

若要计算存储所生成的字符所需的确切数组大小 GetChars ,应使用 GetCharCount 方法。 若要计算最大数组大小,请使用 GetMaxCharCount 方法。 GetCharCount方法通常允许分配较少的内存,而 GetMaxCharCount 方法的执行速度通常更快。

GetCharCount方法确定多少个字符会导致对一个字节序列进行解码,并且该 GetChars 方法执行实际解码。 GetChars方法需要分离转换,这与方法不同, Decoder.GetChars 后者处理单个输入流上的多个传递。

支持和的多个版本 GetCharCountGetChars 。 下面是有关使用这些方法的一些编程注意事项:

  • 您的应用程序可能需要从代码页解码多个输入字节,并使用多个调用处理这些字节。 在这种情况下,可能需要在调用之间维护状态。

  • 如果你的应用程序处理字符串输出,则建议使用 GetString 方法。 由于此方法必须检查字符串长度并分配一个缓冲区,因此它稍慢一些,但生成的 String 类型是首选的。

  • 的字节版本 GetChars(Byte*, Int32, Char*, Int32) 允许一些快速的方法,尤其是对大缓冲区的多个调用。 但请记住,此方法版本有时不安全,因为指针是必需的。

  • 如果你的应用程序必须转换大量数据,则应重新使用输出缓冲区。 在这种情况下, GetChars(Byte[], Int32, Int32, Char[], Int32) 支持输出字符缓冲区的版本是最佳选择。

  • 请考虑使用 Decoder.Convert 方法而不是 GetCharCount 。 转换方法尽可能多地转换数据,如果输出缓冲区太小,则会引发异常。 对于流的连续解码,此方法通常是最佳选择。

另请参阅

适用于

.NET 9 和其他版本
产品 版本
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0