Share via


Encoder クラス

文字のブロックを、エンコードされたバイトのブロックに変換します。

この型のすべてのメンバの一覧については、Encoder メンバ を参照してください。

System.Object
   System.Text.Encoder

<Serializable>
MustInherit Public Class Encoder
[C#]
[Serializable]
public abstract class Encoder
[C++]
[Serializable]
public __gc __abstract class Encoder
[JScript]
public
   Serializable
abstract class Encoder

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

これは抽象クラスです。派生クラスでこのクラスのメソッドをすべて実装し、オーバーライドする必要があります。

このクラスの実装は、 GetBytes メソッドを連続して呼び出すことによって、文字のブロックを、エンコードされたバイトのブロックに変換します。このクラスは、後続の GetBytes の呼び出し間のステータス情報を維持し、隣接するブロックにまたがるサロゲート ペアなどのバイトのシーケンスに文字をエンコードできるようにします。たとえば、文字をサロゲート ペアにエンコードする場合に役立ちます。

GetByteCount メソッドは、指定した文字のブロックをエンコードするために必要なバイト数を計算します。

通常、 Encoder のインスタンスは、 Encoding クラスから派生したクラスの Encoding.GetEncoder メソッドを呼び出すことによって取得されます。

使用例

[Visual Basic, C#, C++] 指定したエンコーディングを使用して Unicode 文字の配列をバイトのブロックに変換する方法を次の例に示します。比較のため、文字配列はまず UTF7Encoding を使ってエンコードされます。次に、 Encoder を使ってエンコードされます。 GetByteCount メソッドを使用して flush パラメータを false に設定すると、呼び出し間のステータスを維持し、出力に余分なバイトが格納されないようにエンコードできます。

 
Imports System
Imports System.Text
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.Strings

Class EncoderTest
    
    Public Shared Sub Main()
        ' Unicode characters.
        ' ChrW(35)  = #
        ' ChrW(37)  = %
        ' ChrW(928) = Pi
        ' ChrW(931) = Sigma
        Dim chars() As Char = {ChrW(35), ChrW(37), ChrW(928), ChrW(931)}
        
        ' Encode characters using an Encoding object.
        Dim encoding As Encoding = Encoding.UTF7
        Console.WriteLine( _
            "Using Encoding" & _
            ControlChars.NewLine & _
            "--------------" _
        )
        
        ' Encode complete array for comparison.
        Dim allCharactersFromEncoding As Byte() = encoding.GetBytes(chars)
        Console.WriteLine("All characters encoded:")
        ShowArray(allCharactersFromEncoding)
        
        ' Encode characters, one-by-one.
        ' The Encoding object will NOT maintain state between calls.
        Dim firstchar As Byte() = encoding.GetBytes(chars, 0, 1)
        Console.WriteLine("First character:")
        ShowArray(firstchar)
        
        Dim secondchar As Byte() = encoding.GetBytes(chars, 1, 1)
        Console.WriteLine("Second character:")
        ShowArray(secondchar)
        
        Dim thirdchar As Byte() = encoding.GetBytes(chars, 2, 1)
        Console.WriteLine("Third character:")
        ShowArray(thirdchar)
        
        Dim fourthchar As Byte() = encoding.GetBytes(chars, 3, 1)
        Console.WriteLine("Fourth character:")
        ShowArray(fourthchar)
        
        
        ' Now, encode characters using an Encoder object.
        Dim encoder As Encoder = encoding.GetEncoder()
        Console.WriteLine( _
            "Using Encoder" & _
            ControlChars.NewLine & _
            "-------------" _
        )
        
        ' Encode complete array for comparison.
        Dim allCharactersFromEncoder( _
            encoder.GetByteCount(chars, 0, chars.Length, True) _
        ) As Byte
        encoder.GetBytes(chars, 0, chars.Length, allCharactersFromEncoder, 0, True)
        Console.WriteLine("All characters encoded:")
        ShowArray(allCharactersFromEncoder)
        
        ' Do not flush state; i.e. maintain state between calls.
        Dim bFlushState As Boolean = False
        
        ' Encode characters one-by-one.
        ' By maintaining state, the Encoder will not store extra bytes in the output.
        Dim firstcharNoFlush( _
            encoder.GetByteCount(chars, 0, 1, bFlushState) _
        ) As Byte
        encoder.GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState)
        Console.WriteLine("First character:")
        ShowArray(firstcharNoFlush)
        
        Dim secondcharNoFlush( _
            encoder.GetByteCount(chars, 1, 1, bFlushState) _
        ) As Byte
        encoder.GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState)
        Console.WriteLine("Second character:")
        ShowArray(secondcharNoFlush)
        
        Dim thirdcharNoFlush( _
            encoder.GetByteCount(chars, 2, 1, bFlushState) _
        ) As Byte
        encoder.GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState)
        Console.WriteLine("Third character:")
        ShowArray(thirdcharNoFlush)
        
        ' Must flush state on last call to GetBytes().
        bFlushState = True
        
        Dim fourthcharNoFlush( _
            encoder.GetByteCount(chars, 3, 1, bFlushState) _
        ) As Byte
        encoder.GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState)
        Console.WriteLine("Fourth character:")
        ShowArray(fourthcharNoFlush)
    End Sub 'Main
    
    
    Public Shared Sub ShowArray(theArray As Array)
        Dim o As Object
        For Each o In  theArray
            Console.Write("[{0}]", o)
        Next o
        Console.WriteLine(ControlChars.NewLine)
    End Sub 'ShowArray
End Class 'EncoderTest

[C#] 
using System;
using System.Text;

class EncoderTest {
    public static void Main() {
        // The characters to encode.
        Char[] chars = new Char[] {
            '\u0023', // #
            '\u0025', // %
            '\u03a0', // Pi
            '\u03a3'  // Sigma
        };

        // Encode characters using an Encoding object.
        Encoding encoding = Encoding.UTF7;
        Console.WriteLine("Using Encoding\n--------------");

        // Encode complete array for comparison.
        Byte[] allCharactersFromEncoding = encoding.GetBytes(chars);
        Console.WriteLine("All characters encoded:");
        ShowArray(allCharactersFromEncoding);

        // Encode characters, one-by-one.
        // The Encoding object will NOT maintain state between calls.
        Byte[] firstchar = encoding.GetBytes(chars, 0, 1);
        Console.WriteLine("First character:");
        ShowArray(firstchar);

        Byte[] secondchar = encoding.GetBytes(chars, 1, 1);
        Console.WriteLine("Second character:");
        ShowArray(secondchar);

        Byte[] thirdchar = encoding.GetBytes(chars, 2, 1);
        Console.WriteLine("Third character:");
        ShowArray(thirdchar);

        Byte[] fourthchar = encoding.GetBytes(chars, 3, 1);
        Console.WriteLine("Fourth character:");
        ShowArray(fourthchar);


        // Now, encode characters using an Encoder object.
        Encoder encoder = encoding.GetEncoder();
        Console.WriteLine("Using Encoder\n-------------");

        // Encode complete array for comparison.
        Byte[] allCharactersFromEncoder = new Byte[encoder.GetByteCount(chars, 0, chars.Length, true)];
        encoder.GetBytes(chars, 0, chars.Length, allCharactersFromEncoder, 0, true);
        Console.WriteLine("All characters encoded:");
        ShowArray(allCharactersFromEncoder);

        // Do not flush state; i.e. maintain state between calls.
        bool bFlushState = false;

        // Encode characters one-by-one.
        // By maintaining state, the Encoder will not store extra bytes in the output.
        Byte[] firstcharNoFlush = new Byte[encoder.GetByteCount(chars, 0, 1, bFlushState)];
        encoder.GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState);
        Console.WriteLine("First character:");
        ShowArray(firstcharNoFlush);

        Byte[] secondcharNoFlush = new Byte[encoder.GetByteCount(chars, 1, 1, bFlushState)];
        encoder.GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState);
        Console.WriteLine("Second character:");
        ShowArray(secondcharNoFlush);

        Byte[] thirdcharNoFlush = new Byte[encoder.GetByteCount(chars, 2, 1, bFlushState)];
        encoder.GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState);
        Console.WriteLine("Third character:");
        ShowArray(thirdcharNoFlush);

        // Must flush state on last call to GetBytes().
        bFlushState = true;
        
        Byte[] fourthcharNoFlush = new Byte[encoder.GetByteCount(chars, 3, 1, bFlushState)];
        encoder.GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState);
        Console.WriteLine("Fourth character:");
        ShowArray(fourthcharNoFlush);
    }

    public static void ShowArray(Array theArray) {
        foreach (Object o in theArray) {
            Console.Write("[{0}]", o);
        }
        Console.WriteLine("\n");
    }
}

[C++] 
#using <mscorlib.dll>
using namespace System;
using namespace System::Text;
using namespace System::Collections;

void ShowArray(Array * theArray)
{
   IEnumerator* myEnum = theArray->GetEnumerator();
   while (myEnum->MoveNext())
   {
      Object* o = __try_cast<Object*>(myEnum->Current);
      Console::Write(S"[{0}]", o);
   }
   Console::WriteLine(S"\n");
}

int main()
{
   // The characters to encode.
   Char chars[] =
   {
      L'\u03a0', // Pi
      L'\u03a3',  // Sigma
      L'\u03a6',
      L'\u03a9',
   };

   // Encode characters using an Encoding Object*.
   Encoding * encoding = Encoding::UTF7;
   Console::WriteLine(S"Using Encoding\n--------------");

   // Encode complete array for comparison.
   Byte allCharactersFromEncoding[] = encoding -> GetBytes(chars);
   Console::WriteLine(S"All characters encoded:");
   ShowArray(allCharactersFromEncoding);

   // Encode characters, one-by-one.
   // The Encoding Object* will NOT maintain state between calls.
   Byte firstchar[] = encoding -> GetBytes(chars, 0, 1);
   Console::WriteLine(S"First character:");
   ShowArray(firstchar);

   Byte secondchar[] = encoding -> GetBytes(chars, 1, 1);
   Console::WriteLine(S"Second character:");
   ShowArray(secondchar);

   Byte thirdchar[] = encoding -> GetBytes(chars, 2, 1);
   Console::WriteLine(S"Third character:");
   ShowArray(thirdchar);

   Byte fourthchar[] = encoding -> GetBytes(chars, 3, 1);
   Console::WriteLine(S"Fourth character:");
   ShowArray(fourthchar);

   // Now, encode characters using an Encoder Object*.
   Encoder * encoder = encoding -> GetEncoder();
   Console::WriteLine(S"Using Encoder\n-------------");

   // Encode complete array for comparison.
   Byte allCharactersFromEncoder[] = new Byte[encoder -> GetByteCount(chars, 0, chars -> Length, true)];
   encoder -> GetBytes(chars, 0, chars -> Length, allCharactersFromEncoder, 0, true);
   Console::WriteLine(S"All characters encoded:");
   ShowArray(allCharactersFromEncoder);

   // Do not flush state; i.e. maintain state between calls.
   bool bFlushState = false;

   // Encode characters one-by-one.
   // By maintaining state, the Encoder will not store extra bytes in the output.
   Byte firstcharNoFlush[] = new Byte[encoder -> GetByteCount(chars, 0, 1, bFlushState)];
   encoder -> GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState);
   Console::WriteLine(S"First character:");
   ShowArray(firstcharNoFlush);

   Byte secondcharNoFlush[] = new Byte[encoder -> GetByteCount(chars, 1, 1, bFlushState)];
   encoder -> GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState);
   Console::WriteLine(S"Second character:");
   ShowArray(secondcharNoFlush);

   Byte thirdcharNoFlush[] = new Byte[encoder -> GetByteCount(chars, 2, 1, bFlushState)];
   encoder -> GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState);
   Console::WriteLine(S"Third character:");
   ShowArray(thirdcharNoFlush);

   // Must flush state on last call to GetBytes().
   bFlushState = true;

   Byte fourthcharNoFlush[] = new Byte[encoder -> GetByteCount(chars, 3, 1, bFlushState)];
   encoder -> GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState);
   Console::WriteLine(S"Fourth character:");
   ShowArray(fourthcharNoFlush);
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Text

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

Encoder メンバ | System.Text 名前空間 | Encoding