Encoding.GetBytes Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Po zastąpieniu w klasie pochodnej koduje zestaw znaków w sekwencji bajtów.
Przeciążenia
GetBytes(Char[]) |
Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonej tablicy znaków w sekwencji bajtów. |
GetBytes(String) |
Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonym ciągu w sekwencji bajtów. |
GetBytes(ReadOnlySpan<Char>, Span<Byte>) |
Po przesłonięciu w klasie pochodnej koduje do zakresu bajtów zestaw znaków z określonego zakresu tylko do odczytu. |
GetBytes(Char[], Int32, Int32) |
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do sekwencji bajtów. |
GetBytes(String, Int32, Int32) |
Po zastąpieniu w klasie pochodnej koduje do tablicy bajtów liczby znaków określonych |
GetBytes(Char*, Int32, Byte*, Int32) |
Po zastąpieniu w klasie pochodnej koduje zestaw znaków rozpoczynający się od określonego wskaźnika znaku do sekwencji bajtów przechowywanych w określonym wskaźniku bajtów. |
GetBytes(Char[], Int32, Int32, Byte[], Int32) |
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do określonej tablicy bajtów. |
GetBytes(String, Int32, Int32, Byte[], Int32) |
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonego ciągu do określonej tablicy bajtów. |
GetBytes(Char[])
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonej tablicy znaków w sekwencji bajtów.
public:
virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars);
public virtual byte[] GetBytes (char[] chars);
abstract member GetBytes : char[] -> byte[]
override this.GetBytes : char[] -> byte[]
Public Overridable Function GetBytes (chars As Char()) As Byte()
Parametry
- chars
- Char[]
Tablica znaków zawierająca znaki do zakodowania.
Zwraca
Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.
Wyjątki
chars
to null
.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do kodowania tablicy znaków, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( array<Char>^chars, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
array<Char>^myChars = gcnew array<Char>{
L'z','a',L'\u0306',L'\u01FD',L'\u03B2',L'\xD8FF',L'\xDCFF'
};
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode the entire array, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, u7 );
PrintCountsAndBytes( myChars, u8 );
PrintCountsAndBytes( myChars, u16LE );
PrintCountsAndBytes( myChars, u16BE );
PrintCountsAndBytes( myChars, u32 );
}
void PrintCountsAndBytes( array<Char>^chars, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( chars );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( chars->Length );
Console::Write( " {0,-3} :", iMBC );
// Encode the array of chars.
array<Byte>^bytes = enc->GetBytes( chars );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire array, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, u7 );
PrintCountsAndBytes( myChars, u8 );
PrintCountsAndBytes( myChars, u16LE );
PrintCountsAndBytes( myChars, u16BE );
PrintCountsAndBytes( myChars, u32 );
}
public static void PrintCountsAndBytes( char[] chars, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( chars.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF)}
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire array, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, u7)
PrintCountsAndBytes(myChars, u8)
PrintCountsAndBytes(myChars, u16LE)
PrintCountsAndBytes(myChars, u16BE)
PrintCountsAndBytes(myChars, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(chars.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Uwagi
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy wywołać wersję GetBytes ciągu metody .
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Zobacz też
Dotyczy
GetBytes(String)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje wszystkie znaki w określonym ciągu w sekwencji bajtów.
public:
virtual cli::array <System::Byte> ^ GetBytes(System::String ^ s);
public virtual byte[] GetBytes (string s);
abstract member GetBytes : string -> byte[]
override this.GetBytes : string -> byte[]
Public Overridable Function GetBytes (s As String) As Byte()
Parametry
- s
- String
Ciąg zawierający znaki do zakodowania.
Zwraca
Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.
Wyjątki
s
to null
.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( String^ s, Encoding^ enc );
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String^ myStr = L"za\u0306\u01FD\u03B2\xD8FF\xDCFF";
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console::WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
void PrintCountsAndBytes( String^ s, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( s->Length );
Console::Write( " {0,-3} :", iMBC );
// Encode the entire string.
array<Byte>^bytes = enc->GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s->ToCharArray(), index, count );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( count );
Console::Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
array<Byte>^bytes = gcnew array<Byte>(iBC);
enc->GetBytes( s, index, count, bytes, bytes->GetLowerBound( 0 ) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Uwagi
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Zobacz też
Dotyczy
GetBytes(ReadOnlySpan<Char>, Span<Byte>)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po przesłonięciu w klasie pochodnej koduje do zakresu bajtów zestaw znaków z określonego zakresu tylko do odczytu.
public:
virtual int GetBytes(ReadOnlySpan<char> chars, Span<System::Byte> bytes);
public virtual int GetBytes (ReadOnlySpan<char> chars, Span<byte> bytes);
abstract member GetBytes : ReadOnlySpan<char> * Span<byte> -> int
override this.GetBytes : ReadOnlySpan<char> * Span<byte> -> int
Public Overridable Function GetBytes (chars As ReadOnlySpan(Of Char), bytes As Span(Of Byte)) As Integer
Parametry
- chars
- ReadOnlySpan<Char>
Zakres zawierający zestaw znaków do zakodowania.
Zwraca
Liczba zakodowanych bajtów.
Uwagi
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Dotyczy
GetBytes(Char[], Int32, Int32)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do sekwencji bajtów.
public:
virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars, int index, int count);
public virtual byte[] GetBytes (char[] chars, int index, int count);
abstract member GetBytes : char[] * int * int -> byte[]
override this.GetBytes : char[] * int * int -> byte[]
Public Overridable Function GetBytes (chars As Char(), index As Integer, count As Integer) As Byte()
Parametry
- chars
- Char[]
Tablica znaków zawierająca zestaw znaków do kodowania.
- index
- Int32
Indeks pierwszego znaku do zakodowania.
- count
- Int32
Liczba znaków do zakodowania.
Zwraca
Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.
Wyjątki
chars
to null
.
index
wartość lub count
jest mniejsza niż zero.
-lub-
index
i count
nie oznaczają prawidłowego zakresu w elemecie chars
.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do kodowania trzech znaków z tablicy znaków, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( array<Char>^chars, int index, int count, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
array<Char>^myChars = gcnew array<Char>{
L'z',L'a',L'\u0306',L'\u01FD',L'\u03B2',L'\xD8FF',L'\xDCFF'
};
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
void PrintCountsAndBytes( array<Char>^chars, int index, int count, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( chars, index, count );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( count );
Console::Write( " {0,-3} :", iMBC );
// Encode the array of chars.
array<Byte>^bytes = enc->GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars, index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, 4, 3, u7)
PrintCountsAndBytes(myChars, 4, 3, u8)
PrintCountsAndBytes(myChars, 4, 3, u16LE)
PrintCountsAndBytes(myChars, 4, 3, u16BE)
PrintCountsAndBytes(myChars, 4, 3, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars, index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars, index, count)
' The following is an alternative way to encode the array of chars:
' 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 bytes(iBC - 1) As Byte
' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Uwagi
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Zobacz też
Dotyczy
GetBytes(String, Int32, Int32)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje do tablicy bajtów liczby znaków określonych count
w określonym ciągu, począwszy od określonego index
.
public:
cli::array <System::Byte> ^ GetBytes(System::String ^ s, int index, int count);
public byte[] GetBytes (string s, int index, int count);
member this.GetBytes : string * int * int -> byte[]
Public Function GetBytes (s As String, index As Integer, count As Integer) As Byte()
Parametry
- s
- String
Ciąg zawierający znaki do zakodowania.
- index
- Int32
Indeks wewnątrz ciągu, z poziomu który ma rozpocząć kodowanie.
- count
- Int32
Liczba znaków do zakodowania.
Zwraca
Tablica bajtów zawierająca wyniki kodowania określonego zestawu znaków.
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( String^ s, Encoding^ enc );
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String^ myStr = L"za\u0306\u01FD\u03B2\xD8FF\xDCFF";
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console::WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
void PrintCountsAndBytes( String^ s, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( s->Length );
Console::Write( " {0,-3} :", iMBC );
// Encode the entire string.
array<Byte>^bytes = enc->GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s->ToCharArray(), index, count );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( count );
Console::Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
array<Byte>^bytes = gcnew array<Byte>(iBC);
enc->GetBytes( s, index, count, bytes, bytes->GetLowerBound( 0 ) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Uwagi
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Dotyczy
GetBytes(Char*, Int32, Byte*, Int32)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Ważne
Ten interfejs API nie jest zgodny ze specyfikacją CLS.
Po zastąpieniu w klasie pochodnej koduje zestaw znaków rozpoczynający się od określonego wskaźnika znaku do sekwencji bajtów przechowywanych w określonym wskaźniku bajtów.
public:
virtual int GetBytes(char* chars, int charCount, System::Byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes (char* chars, int charCount, byte* bytes, int byteCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
Parametry
- chars
- Char*
Wskaźnik do pierwszego znaku w celu zakodowania.
- charCount
- Int32
Liczba znaków do zakodowania.
- bytes
- Byte*
Wskaźnik do lokalizacji, w której należy rozpocząć pisanie wynikowej sekwencji bajtów.
- byteCount
- Int32
Maksymalna liczba bajtów do zapisu.
Zwraca
Rzeczywista liczba bajtów zapisanych w lokalizacji wskazanej bytes
przez parametr .
- Atrybuty
Wyjątki
charCount
wartość lub byteCount
jest mniejsza niż zero.
byteCount
jest mniejsza niż wynikowa liczba bajtów.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Uwagi
Aby obliczyć dokładny rozmiar tablicy, który GetBytes wymaga przechowywania wynikowych bajtów, wywołaj metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zwykle zezwala na alokację mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.
Jeśli dane do konwersji są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder obiektu lub dostarczonego przez GetDecoder metodę lub EncoderGetEncoder, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Zobacz też
Dotyczy
GetBytes(Char[], Int32, Int32, Byte[], Int32)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonej tablicy znaków do określonej tablicy bajtów.
public:
abstract int GetBytes(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public abstract int GetBytes (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : char[] * int * int * byte[] * int -> int
Public MustOverride Function GetBytes (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer
Parametry
- chars
- Char[]
Tablica znaków zawierająca zestaw znaków do kodowania.
- charIndex
- Int32
Indeks pierwszego znaku do zakodowania.
- charCount
- Int32
Liczba znaków do zakodowania.
- bytes
- Byte[]
Tablica bajtów zawierająca wynikową sekwencję bajtów.
- byteIndex
- Int32
Indeks, na którym należy rozpocząć pisanie wynikowej sekwencji bajtów.
Zwraca
Rzeczywista liczba bajtów zapisanych w pliku bytes
.
Wyjątki
charIndex
lub charCount
byteIndex
jest mniejsza niż zero.
-lub-
charIndex
i charCount
nie oznaczają prawidłowego zakresu w elemecie chars
.
-lub-
byteIndex
nie jest prawidłowym indeksem w pliku bytes
.
bytes
nie ma wystarczającej pojemności od byteIndex
do końca tablicy, aby pomieścić wynikowe bajty.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do kodowania trzech znaków z tablicy znaków, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( array<Char>^chars, int index, int count, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
array<Char>^myChars = gcnew array<Char>{
L'z',L'a',L'\u0306',L'\u01FD',L'\u03B2',L'\xD8FF',L'\xDCFF'
};
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
void PrintCountsAndBytes( array<Char>^chars, int index, int count, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( chars, index, count );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( count );
Console::Write( " {0,-3} :", iMBC );
// Encode the array of chars.
array<Byte>^bytes = enc->GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars, index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, 4, 3, u7)
PrintCountsAndBytes(myChars, 4, 3, u8)
PrintCountsAndBytes(myChars, 4, 3, u16LE)
PrintCountsAndBytes(myChars, 4, 3, u16BE)
PrintCountsAndBytes(myChars, 4, 3, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars, index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars, index, count)
' The following is an alternative way to encode the array of chars:
' 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 bytes(iBC - 1) As Byte
' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Uwagi
Aby obliczyć dokładny rozmiar tablicy wymagany przez GetBytes program do przechowywania wynikowych bajtów, należy wywołać metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zwykle zezwala na alokację mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.
Zobacz też
Dotyczy
GetBytes(String, Int32, Int32, Byte[], Int32)
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
- Źródło:
- Encoding.cs
Po zastąpieniu w klasie pochodnej koduje zestaw znaków z określonego ciągu do określonej tablicy bajtów.
public:
virtual int GetBytes(System::String ^ s, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public virtual int GetBytes (string s, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : string * int * int * byte[] * int -> int
override this.GetBytes : string * int * int * byte[] * int -> int
Public Overridable Function GetBytes (s As String, charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer
Parametry
- s
- String
Ciąg zawierający zestaw znaków do zakodowania.
- charIndex
- Int32
Indeks pierwszego znaku do zakodowania.
- charCount
- Int32
Liczba znaków do zakodowania.
- bytes
- Byte[]
Tablica bajtów zawierająca wynikową sekwencję bajtów.
- byteIndex
- Int32
Indeks, na którym należy rozpocząć pisanie wynikowej sekwencji bajtów.
Zwraca
Rzeczywista liczba bajtów zapisanych w pliku bytes
.
Wyjątki
charIndex
lub charCount
byteIndex
jest mniejsza niż zero.
-lub-
charIndex
i charCount
nie oznaczają prawidłowego zakresu w elemecie chars
.
-lub-
byteIndex
nie jest prawidłowym indeksem w pliku bytes
.
bytes
nie ma wystarczającej pojemności od byteIndex
do końca tablicy, aby pomieścić wynikowe bajty.
Wystąpił powrót (aby uzyskać więcej informacji, zobacz Kodowanie znaków na platformie .NET)
-I-
EncoderFallback parametr jest ustawiony na EncoderExceptionFallbackwartość .
Przykłady
Poniższy przykład określa liczbę bajtów wymaganych do zakodowania ciągu lub zakresu w ciągu, koduje znaki i wyświetla wynikowe bajty.
using namespace System;
using namespace System::Text;
void PrintCountsAndBytes( String^ s, Encoding^ enc );
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc );
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String^ myStr = L"za\u0306\u01FD\u03B2\xD8FF\xDCFF";
// Get different encodings.
Encoding^ u7 = Encoding::UTF7;
Encoding^ u8 = Encoding::UTF8;
Encoding^ u16LE = Encoding::Unicode;
Encoding^ u16BE = Encoding::BigEndianUnicode;
Encoding^ u32 = Encoding::UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console::WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console::WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
void PrintCountsAndBytes( String^ s, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( s->Length );
Console::Write( " {0,-3} :", iMBC );
// Encode the entire string.
array<Byte>^bytes = enc->GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintCountsAndBytes( String^ s, int index, int count, Encoding^ enc )
{
// Display the name of the encoding used.
Console::Write( "{0,-30} :", enc );
// Display the exact byte count.
int iBC = enc->GetByteCount( s->ToCharArray(), index, count );
Console::Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc->GetMaxByteCount( count );
Console::Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
array<Byte>^bytes = gcnew array<Byte>(iBC);
enc->GetBytes( s, index, count, bytes, bytes->GetLowerBound( 0 ) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Uwagi
Aby obliczyć dokładny rozmiar tablicy wymagany przez GetBytes program do przechowywania wynikowych bajtów, należy wywołać metodę GetByteCount . Aby obliczyć maksymalny rozmiar tablicy, wywołaj metodę GetMaxByteCount . Metoda GetByteCount zwykle zezwala na alokację mniejszej ilości pamięci, podczas gdy GetMaxByteCount metoda zwykle wykonuje się szybciej.
Jeśli dane, które mają zostać przekonwertowane, są dostępne tylko w blokach sekwencyjnych (takich jak dane odczytane ze strumienia) lub jeśli ilość danych jest tak duża, że należy podzielić je na mniejsze bloki, należy użyć Decoder metody lub Encoder dostarczonej przez GetDecoder metodę lub GetEncoder metodę, odpowiednio, klasy pochodnej.
Metoda GetByteCount określa, ile bajtów powoduje kodowanie zestawu znaków Unicode, a GetBytes metoda wykonuje rzeczywiste kodowanie. Metoda Encoding.GetBytes oczekuje dyskretnych konwersji, w przeciwieństwie do Encoder.GetBytes metody, która obsługuje wiele konwersji na jednym strumieniu wejściowym.
Obsługiwane są różne wersje GetByteCount programu i GetBytes . Poniżej przedstawiono kilka zagadnień programistycznych dotyczących używania tych metod:
Aplikacja może wymagać zakodowania wielu znaków wejściowych do strony kodowej i przetworzenia znaków przy użyciu wielu wywołań. W takim przypadku prawdopodobnie trzeba zachować stan między wywołaniami, biorąc pod uwagę stan, który jest utrwalany przez Encoder używany obiekt. (Na przykład sekwencja znaków zawierająca pary zastępcze może kończyć się wysokim zastępcą. Pamiętaj Encoder , że wysoki surogat tak, aby można go było połączyć z niskim zastępcą na początku następującego wywołania. Encoding Nie będzie w stanie utrzymać stanu, więc postać zostanie wysłana do EncoderFallbackznaku .
Jeśli aplikacja obsługuje dane wejściowe ciągów, należy użyć wersji ciągu .GetBytes
Wersja buforu GetBytes(Char*, Int32, Byte*, Int32) znaków Unicode programu umożliwia szybkie techniki, szczególnie w przypadku wielu wywołań przy użyciu Encoder obiektu lub wstawiania do istniejących buforów. Należy jednak pamiętać, że ta wersja metody jest czasami niebezpieczna, ponieważ wymagane są wskaźniki.
Jeśli aplikacja musi przekonwertować dużą ilość danych, powinna ponownie użyć buforu wyjściowego. W takim przypadku najlepszym wyborem jest wersja obsługująca GetBytes tablice bajtów.
Rozważ użycie Encoder.Convert metody zamiast GetByteCount. Metoda konwersji konwertuje jak najwięcej danych i zgłasza wyjątek, jeśli bufor wyjściowy jest zbyt mały. W przypadku ciągłego kodowania strumienia ta metoda jest często najlepszym wyborem.