Encoding.GetMaxCharCount(Int32) Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Při přepsání v odvozené třídě vypočítá maximální počet znaků vytvořený dekódováním zadaného počtu bajtů.
public:
abstract int GetMaxCharCount(int byteCount);
public abstract int GetMaxCharCount (int byteCount);
abstract member GetMaxCharCount : int -> int
Public MustOverride Function GetMaxCharCount (byteCount As Integer) As Integer
Parametry
- byteCount
- Int32
Počet bajtů k dekódování.
Návraty
Maximální počet znaků vytvořený dekódováním zadaného počtu bajtů.
Výjimky
Hodnota byteCount
je menší než nula.
Došlo k záložnímu stavu (další informace najdete v tématu Kódování znaků v rozhraní .NET).
-and-
DecoderFallback je nastavená na DecoderExceptionFallback .
Příklady
Následující příklad zakóduje řetězec do pole bajtů a potom je dekóduje do pole znaků.
using namespace System;
using namespace System::Text;
void PrintCountsAndChars( array<Byte>^bytes, Encoding^ enc );
int 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.
array<Byte>^barrBE = gcnew array<Byte>(u32BE->GetByteCount( myStr ));
u32BE->GetBytes( myStr, 0, myStr->Length, barrBE, 0 );
// Encode the string using the little-endian byte order.
array<Byte>^barrLE = gcnew array<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 );
}
void PrintCountsAndChars( array<Byte>^bytes, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-25} :", enc );
// 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.
array<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ăǽβ
*/
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ăǽβ
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
Dim u32BE As Encoding = 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)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)
' Encode the string using the big-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)
' Encode the string using the little-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
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)
End Sub
Public Shared Sub PrintCountsAndChars(bytes() As Byte, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-25} :", enc.ToString())
' Display the exact character count.
Dim iCC As Integer = enc.GetCharCount(bytes)
Console.Write(" {0,-3}", iCC)
' Display the maximum character count.
Dim iMCC As Integer = enc.GetMaxCharCount(bytes.Length)
Console.Write(" {0,-3} :", iMCC)
' Decode the bytes and display the characters.
Dim chars As Char() = enc.GetChars(bytes)
Console.WriteLine(chars)
End Sub
End Class
'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ăǽβ
Poznámky
Pokud chcete vypočítat přesnou velikost pole vyžadované k uložení GetChars výsledných znaků, měli byste použít GetCharCount metodu . K výpočtu maximální velikosti pole použijte GetMaxCharCount metodu . Metoda GetCharCount obecně umožňuje přidělení menší paměti, zatímco metoda se obecně spouští GetMaxCharCount rychleji.
GetMaxCharCount načte číslo nejhoršího případu, včetně nejhoršího případu pro aktuálně vybranou hodnotu DecoderFallback . Pokud zvolíte záložní hodnotu s potenciálně velkým řetězcem, GetMaxCharCount načte velké hodnoty.
Ve většině případů tato metoda načte přiměřená čísla pro malé řetězce. U velkých řetězců možná budete muset zvolit mezi používáním velmi velkých vyrovnávacích pamětí a zachycením chyb ve výjimečných případech, kdy je přiměřenější vyrovnávací paměť příliš malá. Můžete také zvážit jiný přístup pomocí nebo GetCharCount Decoder.Convert .
GetMaxCharCount nemá žádný vztah k GetBytes . Pokud potřebujete podobnou funkci pro použití s GetBytes , měli byste použít GetMaxByteCount .
Při použití byste měli výstupní vyrovnávací paměť přidělit na GetMaxCharCount základě maximální velikosti vstupní vyrovnávací paměti. Pokud je výstupní vyrovnávací paměť omezena velikostí, můžete použít Decoder.Convert metodu .
Všimněte si, že se bere v úvahu nejhorší případ GetMaxCharCount pro zbylé bajty z předchozí operace kodéru. U většiny znakových stránek předání hodnoty 0 této metodě načte hodnoty větší než nebo rovno 1.
Poznámka
GetMaxCharCount(N)
nemusí být nutně stejná hodnota jako N* GetMaxCharCount(1)
.
Poznámky pro implementátory
Všechny implementace musí zaručit, že při nastavení velikosti vyrovnávacích pamětí na základě výsledků výpočtů této metody nedojde k Encoding výjimce přetečení vyrovnávací paměti.