Encoder.Convert 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
將 Unicode 字元的緩衝區或陣列轉換成編碼的位元組序列。
多載
Convert(ReadOnlySpan<Char>, Span<Byte>, Boolean, Int32, Int32, Boolean) |
將 Unicode 字元範圍轉換為編碼的位元組序列,並將結果儲存在另一個緩衝區內。 |
Convert(Char*, Int32, Byte*, Int32, Boolean, Int32, Int32, Boolean) |
將 Unicode 字元的緩衝區轉換成編碼的位元組序列,並將結果儲存在另一個緩衝區。 |
Convert(Char[], Int32, Int32, Byte[], Int32, Int32, Boolean, Int32, Int32, Boolean) |
將 Unicode 字元的陣列轉換成編碼的位元組序列,並將結果儲存在位元組陣列中。 |
Convert(ReadOnlySpan<Char>, Span<Byte>, Boolean, Int32, Int32, Boolean)
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
將 Unicode 字元範圍轉換為編碼的位元組序列,並將結果儲存在另一個緩衝區內。
public:
virtual void Convert(ReadOnlySpan<char> chars, Span<System::Byte> bytes, bool flush, [Runtime::InteropServices::Out] int % charsUsed, [Runtime::InteropServices::Out] int % bytesUsed, [Runtime::InteropServices::Out] bool % completed);
public virtual void Convert (ReadOnlySpan<char> chars, Span<byte> bytes, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
abstract member Convert : ReadOnlySpan<char> * Span<byte> * bool * int * int * bool -> unit
override this.Convert : ReadOnlySpan<char> * Span<byte> * bool * int * int * bool -> unit
Public Overridable Sub Convert (chars As ReadOnlySpan(Of Char), bytes As Span(Of Byte), flush As Boolean, ByRef charsUsed As Integer, ByRef bytesUsed As Integer, ByRef completed As Boolean)
參數
- chars
- ReadOnlySpan<Char>
要轉換的 UTF-16 編碼字元範圍。
- flush
- Boolean
若表示不進行任何其他資料轉換即為 true
;否則為 false
。
- charsUsed
- Int32
傳回此方法時,包含來自 chars
為轉換所使用的位元組數目。 這個參數會以未初始化的狀態傳遞。
- bytesUsed
- Int32
傳回此方法時,包含轉換所使用的位元組數目。 這個參數會以未初始化的狀態傳遞。
- completed
- Boolean
當這個方法傳回時,若 chars
中的所有字元皆已轉換,則為 true
;否則為 false
。 這個參數會以未初始化的狀態傳遞。
備註
請記住,物件會在 Encoder 呼叫 Convert之間儲存狀態。 當應用程式使用數據流完成時,它應該將 參數設定 flush
為 true
,以確保已排清狀態資訊。 使用此設定時,編碼器會忽略數據區塊結尾的無效位元組,並清除內部緩衝區。 屬於邏輯單元一部分的任何剩餘已處理數據,例如 Surrogate 配對的高 Surrogate,會根據目前的後援設定來轉換。
方法 Convert
的設計目的是在迴圈中使用,以編碼任意數量的輸入,例如從檔案或數據流讀取的數據。 它會將編碼作業的輸出儲存在固定大小緩衝區中。
GetBytes 如果輸出緩衝區不夠大,但會盡可能填滿空間,並 Convert 傳回寫入的字元,將會擲回例外狀況。 另請參閱 Encoding.GetBytes 主題以取得更多批注。
completed
輸出參數會指出輸入緩衝區中的所有數據是否已轉換並儲存在輸出緩衝區中。 如果參數所charCount
指定的字元數目無法轉換,但不能超過 參數所byteCount
指定的位元元組數目,這個參數就會設定false
為 。 在此情況下,應用程式應該使用輸出緩衝區的內容,或提供新的輸出緩衝區、將參數遞增 chars
為 參數指定的 charsUsed
字元數,然後再次呼叫 Convert
方法來處理剩餘的輸入。
completed
參數也可以設定為 false
,即使charsUsed
參數和 'char' 範圍長度相等也一樣。 如果物件中仍有尚未儲存在chars
緩衝區中的數據Encoder,就會發生這種狀況。
適用於
Convert(Char*, Int32, Byte*, Int32, Boolean, Int32, Int32, Boolean)
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
重要
此 API 不符合 CLS 規範。
將 Unicode 字元的緩衝區轉換成編碼的位元組序列,並將結果儲存在另一個緩衝區。
public:
virtual void Convert(char* chars, int charCount, System::Byte* bytes, int byteCount, bool flush, [Runtime::InteropServices::Out] int % charsUsed, [Runtime::InteropServices::Out] int % bytesUsed, [Runtime::InteropServices::Out] bool % completed);
[System.CLSCompliant(false)]
public virtual void Convert (char* chars, int charCount, byte* bytes, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual void Convert (char* chars, int charCount, byte* bytes, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
[System.Security.SecurityCritical]
public virtual void Convert (char* chars, int charCount, byte* bytes, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
[<System.CLSCompliant(false)>]
abstract member Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
override this.Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
override this.Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
[<System.Security.SecurityCritical>]
abstract member Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
override this.Convert : nativeptr<char> * int * nativeptr<byte> * int * bool * int * int * bool -> unit
參數
- chars
- Char*
要轉換的 UTF-16 編碼字元字串位址。
- charCount
- Int32
chars
中要轉換的字元數。
- bytes
- Byte*
緩衝區位址,用來儲存已轉換的位元組。
- byteCount
- Int32
bytes
中要用於轉換的位元數上限。
- flush
- Boolean
若表示不進行任何其他資料轉換即為 true
;否則為 false
。
- charsUsed
- Int32
傳回此方法時,包含來自 chars
為轉換所使用的位元組數目。 這個參數會以未初始化的狀態傳遞。
- bytesUsed
- Int32
傳回此方法時,包含轉換所使用的位元組數目。 這個參數會以未初始化的狀態傳遞。
- completed
- Boolean
傳回此方法時,若所有 charCount
指定的字元皆已轉換則包含 true
;否則為 false
。 這個參數會以未初始化的狀態傳遞。
- 屬性
例外狀況
chars
或 bytes
是 null
(Nothing
)。
charCount
或 byteCount
小於零。
輸出緩衝區太小而無法包含任何已轉換的輸入。 輸出緩衝區應大於或等於 GetByteCount 方法所指出的大小。
備註
請記住,物件會在 Encoder 呼叫 Convert之間儲存狀態。 當應用程式使用數據流完成時,它應該將 參數設定 flush
為 true
,以確保已排清狀態資訊。 使用此設定時,編碼器會忽略數據區塊結尾的無效位元組,並清除內部緩衝區。 屬於邏輯單元一部分的任何剩餘已處理數據,例如 Surrogate 配對的高 Surrogate,會根據目前的後援設定來轉換。
方法 Convert
的設計目的是在迴圈中使用,以編碼任意數量的輸入,例如從檔案或數據流讀取的數據。 它會將編碼作業的輸出儲存在固定大小緩衝區中。
GetBytes 如果輸出緩衝區不夠大,但會盡可能填滿空間,並 Convert 傳回寫入的字元,將會擲回例外狀況。 另請參閱 Encoding.GetBytes 主題以取得更多批注。
completed
輸出參數會指出輸入緩衝區中的所有數據是否已轉換並儲存在輸出緩衝區中。 如果參數所charCount
指定的字元數目無法轉換,但不能超過 參數所byteCount
指定的位元元組數目,這個參數就會設定false
為 。 在此情況下,應用程式應該使用輸出緩衝區的內容,或提供新的輸出緩衝區、將參數遞增 chars
為 參數指定的 charsUsed
字元數,然後再次呼叫 Convert
方法來處理剩餘的輸入。
completed
參數也可以設定為 false
,即使 charsUsed
和 charCount
參數相等也一樣。 如果物件中仍有尚未儲存在chars
緩衝區中的數據Encoder,就會發生這種狀況。
適用於
Convert(Char[], Int32, Int32, Byte[], Int32, Int32, Boolean, Int32, Int32, Boolean)
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
- 來源:
- Encoder.cs
將 Unicode 字元的陣列轉換成編碼的位元組序列,並將結果儲存在位元組陣列中。
public:
virtual void Convert(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex, int byteCount, bool flush, [Runtime::InteropServices::Out] int % charsUsed, [Runtime::InteropServices::Out] int % bytesUsed, [Runtime::InteropServices::Out] bool % completed);
public virtual void Convert (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
[System.Runtime.InteropServices.ComVisible(false)]
public virtual void Convert (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex, int byteCount, bool flush, out int charsUsed, out int bytesUsed, out bool completed);
abstract member Convert : char[] * int * int * byte[] * int * int * bool * int * int * bool -> unit
override this.Convert : char[] * int * int * byte[] * int * int * bool * int * int * bool -> unit
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member Convert : char[] * int * int * byte[] * int * int * bool * int * int * bool -> unit
override this.Convert : char[] * int * int * byte[] * int * int * bool * int * int * bool -> unit
Public Overridable Sub Convert (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer, byteCount As Integer, flush As Boolean, ByRef charsUsed As Integer, ByRef bytesUsed As Integer, ByRef completed As Boolean)
參數
- chars
- Char[]
要轉換的字元陣列。
- charIndex
- Int32
chars
中要轉換的第一個項目。
- charCount
- Int32
要轉換的 chars
項目數目。
- bytes
- Byte[]
儲存位元組儲存所在的陣列。
- byteIndex
- Int32
bytes
中的第一個項目,其為儲存資料所在。
- byteCount
- Int32
轉換中要使用的 bytes
之項目數上限。
- flush
- Boolean
若表示不進行任何其他資料轉換即為 true
;否則為 false
。
- charsUsed
- Int32
傳回此方法時,包含來自 chars
為轉換所使用的位元組數目。 這個參數會以未初始化的狀態傳遞。
- bytesUsed
- Int32
傳回此方法時,包含轉換所產生的位元組數目。 這個參數會以未初始化的狀態傳遞。
- completed
- Boolean
傳回此方法時,若所有 charCount
指定的字元皆已轉換則包含 true
;否則為 false
。 這個參數會以未初始化的狀態傳遞。
- 屬性
例外狀況
chars
或 bytes
是 null
(Nothing
)。
charIndex
、charCount
、byteIndex
或 byteCount
小於零。
-或-
chars
-
charIndex
的長度小於 charCount
。
-或-
bytes
-
byteIndex
的長度小於 byteCount
。
輸出緩衝區太小而無法包含任何已轉換的輸入。 輸出緩衝區應大於或等於 GetByteCount 方法所指出的大小。
範例
下列範例使用 Convert 方法將 UTF-16 字元的檔案轉換成 UTF-8,然後使用 Convert 方法將 UTF-8 字元轉換回 UTF-16 個字元。
// This code example demonstrates the Encoder.Convert() and Decoder.Convert methods.
// This example uses files for input and output, but any source that can be expressed
// as a stream can be used instead.
using System;
using System.Text;
using System.IO;
public class Sample
{
static void Main(string[] args)
{
// Create a large file of UTF-16 encoded Unicode characters. The file is named Example.txt,
// and is used as input to the Encoder.Convert() method.
CreateTestFile("Example.txt");
// Using an input file of UTF-16 encoded characters named Example.txt, create an output file
// of UTF-8 encoded bytes named UTF8.txt.
EncoderConvert("Example.txt", "UTF8.txt", Encoding.UTF8);
// Using an input file of UTF-8 encoded bytes named UTF8.txt, create an output file
// of UTF-16 encoded characters named UTF16.txt.
DecoderConvert("UTF8.txt", "UTF16.txt", Encoding.UTF8);
}
// --------------------------------------------------------------------------------------------
// Use the Encoder.Convert() method to convert a file of characters to a file of encoded bytes.
// --------------------------------------------------------------------------------------------
static void EncoderConvert(String inputFileName, String outputFileName, Encoding enc)
{
// Convert an input file of characters to an output file of encoded bytes.
// StreamWriter could convert the input file for us, but we'll perform the conversion
// ourselves.
FileStream fs = new FileStream(outputFileName, FileMode.Create);
BinaryWriter outputFile = new BinaryWriter(fs);
// StreamReader will detect Unicode encoding from the Byte Order Mark that heads the input file.
StreamReader inputFile = new StreamReader(inputFileName);
// Get an Encoder.
Encoder encoder = enc.GetEncoder();
// Guarantee the output buffer large enough to convert a few characters.
int UseBufferSize = 64;
if (UseBufferSize < enc.GetMaxByteCount(10))
UseBufferSize = enc.GetMaxByteCount(10);
byte[] bytes = new byte[UseBufferSize];
// Intentionally make the input character buffer larger than the output byte buffer so the
// conversion loop executes more than one cycle.
char[] chars = new char[UseBufferSize * 4];
int charsRead;
do
{
// Read at most the number of characters that will fit in the input buffer. The return
// value is the actual number of characters read, or zero if no characters remain.
charsRead = inputFile.Read(chars, 0, UseBufferSize * 4);
bool completed = false;
int charIndex = 0;
int charsUsed;
int bytesUsed;
while (!completed)
{
// If this is the last input data, flush the encoder's internal buffer and state.
bool flush = (charsRead == 0);
encoder.Convert(chars, charIndex, charsRead - charIndex,
bytes, 0, UseBufferSize, flush,
out charsUsed, out bytesUsed, out completed);
// The conversion produced the number of bytes indicated by bytesUsed. Write that number
// of bytes to the output file.
outputFile.Write(bytes, 0, bytesUsed);
// Increment charIndex to the next block of characters in the input buffer, if any, to convert.
charIndex += charsUsed;
}
}
while(charsRead != 0);
outputFile.Close();
fs.Close();
inputFile.Close();
}
// --------------------------------------------------------------------------------------------
// Use the Decoder.Convert() method to convert a file of encoded bytes to a file of characters.
// --------------------------------------------------------------------------------------------
static void DecoderConvert(String inputFileName, String outputFileName, Encoding enc)
{
// Convert an input file of of encoded bytes to an output file characters.
// StreamWriter could convert the input file for us, but we'll perform the conversion
// ourselves.
StreamWriter outputFile = new StreamWriter(outputFileName, false, Encoding.Unicode);
// Read the input as a binary file so we can detect the Byte Order Mark.
FileStream fs = new FileStream(inputFileName, FileMode.Open);
BinaryReader inputFile = new BinaryReader(fs);
// Get a Decoder.
Decoder decoder = enc.GetDecoder();
// Guarantee the output buffer large enough to convert a few characters.
int UseBufferSize = 64;
if (UseBufferSize < enc.GetMaxCharCount(10))
UseBufferSize = enc.GetMaxCharCount(10);
char[] chars = new char[UseBufferSize];
// Intentionally make the input byte buffer larger than the output character buffer so the
// conversion loop executes more than one cycle.
byte[] bytes = new byte[UseBufferSize * 4];
int bytesRead;
do
{
// Read at most the number of bytes that will fit in the input buffer. The
// return value is the actual number of bytes read, or zero if no bytes remain.
bytesRead = inputFile.Read(bytes, 0, UseBufferSize * 4);
bool completed = false;
int byteIndex = 0;
int bytesUsed;
int charsUsed;
while (!completed)
{
// If this is the last input data, flush the decoder's internal buffer and state.
bool flush = (bytesRead == 0);
decoder.Convert(bytes, byteIndex, bytesRead - byteIndex,
chars, 0, UseBufferSize, flush,
out bytesUsed, out charsUsed, out completed);
// The conversion produced the number of characters indicated by charsUsed. Write that number
// of characters to the output file.
outputFile.Write(chars, 0, charsUsed);
// Increment byteIndex to the next block of bytes in the input buffer, if any, to convert.
byteIndex += bytesUsed;
}
}
while(bytesRead != 0);
outputFile.Close();
fs.Close();
inputFile.Close();
}
// --------------------------------------------------------------------------------------------
// Create a large file of UTF-16 encoded Unicode characters.
// --------------------------------------------------------------------------------------------
static void CreateTestFile(String FileName)
{
// StreamWriter defaults to UTF-8 encoding so explicitly specify Unicode, that is,
// UTF-16, encoding.
StreamWriter file = new StreamWriter(FileName, false, Encoding.Unicode);
// Write a line of text 100 times.
for (int i = 0; i < 100; i++)
{
file.WriteLine("This is an example input file used by the convert example.");
}
// Write Unicode characters from U+0000 to, but not including, the surrogate character range.
for (char c = (char)0; c < (char)0xD800; c++)
{
file.Write(c);
}
file.Close();
}
}
/*
This code example produces the following results:
(Execute the -dir- console window command and examine the files created.)
Example.txt, which contains 122,594 bytes (61,297 UTF-16 encoded characters).
UTF8.txt, which contains 169,712 UTF-8 encoded bytes.
UTF16.txt, which contains 122,594 bytes (61,297 UTF-16 encoded characters).
(Execute the -comp- console window command and compare the two Unicode files.)
>comp example.txt utf16.txt /L
Comparing example.txt and utf16.txt...
Files compare OK
(The two files are equal.)
*/
' This code example demonstrates the Encoder.Convert() and Decoder.Convert methods.
' This example uses files for input and output, but any source that can be expressed
' as a stream can be used instead.
Imports System.Text
Imports System.IO
Public Class Sample
Shared Sub Main(ByVal args() As String)
' Create a large file of UTF-16 encoded Unicode characters. The file is named Example.txt,
' and is used as input to the Encoder.Convert() method.
CreateTestFile("Example.txt")
' Using an input file of UTF-16 encoded characters named Example.txt, create an output file
' of UTF-8 encoded bytes named UTF8.txt.
EncoderConvert("Example.txt", "UTF8.txt", Encoding.UTF8)
' Using an input file of UTF-8 encoded bytes named UTF8.txt, create an output file
' of UTF-16 encoded characters named UTF16.txt.
DecoderConvert("UTF8.txt", "UTF16.txt", Encoding.UTF8)
End Sub
' --------------------------------------------------------------------------------------------
' Use the Encoder.Convert() method to convert a file of characters to a file of encoded bytes.
' --------------------------------------------------------------------------------------------
Shared Sub EncoderConvert(ByVal inputFileName As String, ByVal outputFileName As String, ByVal enc As Encoding)
' Convert an input file of characters to an output file of encoded bytes.
' StreamWriter could convert the input file for us, but we'll perform the conversion
' ourselves.
Dim fs As New FileStream(outputFileName, FileMode.Create)
Dim outputFile As New BinaryWriter(fs)
' StreamReader will detect Unicode encoding from the Byte Order Mark that heads the input file.
Dim inputFile As New StreamReader(inputFileName)
' Get an Encoder.
Dim encoder As Encoder = enc.GetEncoder()
' Guarantee the output buffer large enough to convert a few characters.
Dim UseBufferSize As Integer = 64
If UseBufferSize < enc.GetMaxByteCount(10) Then
UseBufferSize = enc.GetMaxByteCount(10)
End If
Dim bytes(UseBufferSize) As Byte
' Intentionally make the input character buffer larger than the output byte buffer so the
' conversion loop executes more than one cycle.
Dim chars(UseBufferSize * 4) As Char
Dim charsRead As Integer
Do
' Read at most the number of characters that will fit in the input buffer. The return
' value is the actual number of characters read, or zero if no characters remain.
charsRead = inputFile.Read(chars, 0, UseBufferSize * 4)
Dim completed As Boolean = False
Dim charIndex As Integer = 0
Dim charsUsed As Integer
Dim bytesUsed As Integer
While Not completed
' If this is the last input data, flush the encoder's internal buffer and state.
Dim flush As Boolean = charsRead = 0
encoder.Convert(chars, charIndex, charsRead - charIndex, bytes, 0, UseBufferSize, flush, charsUsed, bytesUsed, completed)
' The conversion produced the number of bytes indicated by bytesUsed. Write that number
' of bytes to the output file.
outputFile.Write(bytes, 0, bytesUsed)
' Increment charIndex to the next block of characters in the input buffer, if any, to convert.
charIndex += charsUsed
End While
Loop While charsRead <> 0
outputFile.Close()
fs.Close()
inputFile.Close()
End Sub
' --------------------------------------------------------------------------------------------
' Use the Decoder.Convert() method to convert a file of encoded bytes to a file of characters.
' --------------------------------------------------------------------------------------------
Shared Sub DecoderConvert(ByVal inputFileName As String, ByVal outputFileName As String, ByVal enc As Encoding)
' Convert an input file of of encoded bytes to an output file characters.
' StreamWriter could convert the input file for us, but we'll perform the conversion
' ourselves.
Dim outputFile As New StreamWriter(outputFileName, False, Encoding.Unicode)
' Read the input as a binary file so we can detect the Byte Order Mark.
Dim fs As New FileStream(inputFileName, FileMode.Open)
Dim inputFile As New BinaryReader(fs)
' Get a Decoder.
Dim decoder As Decoder = enc.GetDecoder()
' Guarantee the output buffer large enough to convert a few characters.
Dim UseBufferSize As Integer = 64
If UseBufferSize < enc.GetMaxCharCount(10) Then
UseBufferSize = enc.GetMaxCharCount(10)
End If
Dim chars(UseBufferSize) As Char
' Intentionally make the input byte buffer larger than the output character buffer so the
' conversion loop executes more than one cycle.
Dim bytes(UseBufferSize * 4) As Byte
Dim bytesRead As Integer
Do
' Read at most the number of bytes that will fit in the input buffer. The
' return value is the actual number of bytes read, or zero if no bytes remain.
bytesRead = inputFile.Read(bytes, 0, UseBufferSize * 4)
Dim completed As Boolean = False
Dim byteIndex As Integer = 0
Dim bytesUsed As Integer
Dim charsUsed As Integer
While Not completed
' If this is the last input data, flush the decoder's internal buffer and state.
Dim flush As Boolean = bytesRead = 0
decoder.Convert(bytes, byteIndex, bytesRead - byteIndex, chars, 0, UseBufferSize, flush, bytesUsed, charsUsed, completed)
' The conversion produced the number of characters indicated by charsUsed. Write that number
' of characters to the output file.
outputFile.Write(chars, 0, charsUsed)
' Increment byteIndex to the next block of bytes in the input buffer, if any, to convert.
byteIndex += bytesUsed
End While
Loop While bytesRead <> 0
outputFile.Close()
fs.Close()
inputFile.Close()
End Sub
' --------------------------------------------------------------------------------------------
' Create a large file of UTF-16 encoded Unicode characters.
' --------------------------------------------------------------------------------------------
Shared Sub CreateTestFile(ByVal FileName As String)
' StreamWriter defaults to UTF-8 encoding so explicitly specify Unicode, that is,
' UTF-16, encoding.
Dim file As New StreamWriter(FileName, False, Encoding.Unicode)
' Write a line of text 100 times.
Dim i As Integer
For i = 0 To 99
file.WriteLine("This is an example input file used by the convert example.")
Next i
' Write Unicode characters from U+0000 to, but not including, the surrogate character range.
Dim c As Integer
For c = 0 To &HD800
file.Write(ChrW(c))
Next c
file.Close()
End Sub
End Class
'
'This code example produces the following results:
'
'(Execute the -dir- console window command and examine the files created.)
'
'Example.txt, which contains 122,594 bytes (61,297 UTF-16 encoded characters).
'UTF8.txt, which contains 169,712 UTF-8 encoded bytes.
'UTF16.txt, which contains 122,594 bytes (61,297 UTF-16 encoded characters).
'
'(Execute the -comp- console window command and compare the two Unicode files.)
'
'>comp example.txt utf16.txt /L
'Comparing example.txt and utf16.txt...
'Files compare OK
'
'(The two files are equal.)
'
備註
請記住,物件會在 Encoder 呼叫 Convert之間儲存狀態。 當應用程式使用數據流完成時,它應該將 參數設定 flush
為 true
,以確保已排清狀態資訊。 使用此設定時,編碼器會忽略數據區塊結尾的無效位元組,並清除內部緩衝區。 屬於邏輯單元一部分的任何剩餘已處理數據,例如 Surrogate 配對的高 Surrogate,會根據目前的後援設定來轉換。
方法 Convert
的設計目的是在迴圈中使用,以編碼任意數量的輸入,例如從檔案或數據流讀取的數據。 它會將編碼作業的輸出儲存在固定大小緩衝區中。
GetBytes 如果輸出緩衝區不夠大,但會盡可能填滿空間,並 Convert 傳回寫入的字元,將會擲回例外狀況。 另請參閱文章 Encoding.GetBytes 以取得更多批注。
completed
輸出參數會指出輸入緩衝區中的所有數據是否已轉換並儲存在輸出緩衝區中。 如果參數所charCount
指定的字元數目無法轉換,但未超過 參數指定的位元元數目,這個參數就會設定false
為 byteCount
。 在此情況下,應用程式應該使用輸出緩衝區的內容,或提供新的輸出緩衝區、以參數指定的charsUsed
字元數遞增chars
參數,然後再次呼叫 Convert
方法來處理剩餘的輸入。
completed
即使 charsUsed
與 charCount
參數相等,參數也可以設定為 false
。 如果物件中仍有尚未儲存在chars
緩衝區中的數據Encoder,就會發生這種情況。