次の方法で共有


Unicode エンコーディングの使用

更新 : 2007 年 11 月

共通言語ランタイムをターゲットとするアプリケーションは、エンコーディングによって文字表現をネイティブの文字スキーム (Unicode) から別のスキームに変換します。これらのアプリケーションは、デコーディングによって非ネイティブ スキーム (非 Unicode) の文字をネイティブ スキームに割り当てます。System.Text 名前空間には、アプリケーションで文字のエンコードとデコードに使用できるクラスが数多く用意されています。それらのクラスの概要については、「エンコーディングの理解」を参照してください。

Unicode 変換形式

Unicode Standard では、サポートされるすべてのスクリプトについて、各文字にコード ポイント (数値) を割り当てています。コード ポイントのエンコードには、UTF (Unicode Transformation Format) と呼ばれる形式を使用します。Unicode Standard Version 3.2 では、次の表に示す UTF およびその他のエンコーディングが使用されています。いずれのエンコーディングでも、.NET Framework 内部の文字列はネイティブな UTF-16 文字列です。

  • Unicode UTF-32 エンコーディング
    Unicode 文字を 32 ビット整数のシーケンスとして表します。アプリケーションで文字と UTF-32 エンコーディングとの間で変換を実行するには、UTF32Encoding クラスを使用します。

    UTF-32 は、エンコードされた空白がきわめて重要な意味を持つシステムでアプリケーションが UTF-16 のサロゲート コード ポイント動作を回避する必要がある場合に使用します。ディスプレイ上でレンダリングされる 1 つの "グリフ" も複数の UTF-32 文字でエンコードされることがあります。この動作の影響を受ける補助文字は、現在のところ Unicode BMP 文字に比べるときわめてまれです。

  • Unicode UTF-16 エンコーディング
    Unicode 文字を 16 ビット整数のシーケンスとして表します。アプリケーションで文字と UTF-16 エンコーディングとの間で変換を実行するには、UnicodeEncoding クラスを使用します。

    UTF-16 は、Microsoft.Net char 型、Windows WCHAR 型、および他の一般的な型で使用されているように、ネイティブに使用されることが多いエンコーディングです。ほとんどの一般的な Unicode コード ポイントは、UTF-16 コード ポイント (2 バイト) を 1 つだけ使用します。ただし、Unicode の補助文字 U+10000 以上は、2 つの UTF-16 サロゲート コード ポイントを必要とします。

  • Unicode UTF-8 エンコーディング
    Unicode 文字を 8 ビット バイトのシーケンスとして表します。アプリケーションで文字と UTF-8 エンコーディングとの間で変換を実行するには、UTF8Encoding クラスを使用します。

    UTF-8 では、8 ビット データ サイズを使用したエンコーディングが可能であり、既存の多くのオペレーティング システムに対応できます。ASCII 範囲の文字については、UTF-8 は ASCII エンコーディングと一致し、より広範な文字を提供します。ただし、CJK スクリプトでは、UTF-8 の各文字に 3 バイトが必要となることがあり、データ サイズが UTF-16 より大きくなる可能性があります。その場合でも、CJK 範囲のサイズの拡大が HTML タグなどの ASCII データのサイズによって相殺されることがあります。

  • Unicode UTF-7 エンコーディング
    Unicode 文字を 7 ビット ASCII 文字のシーケンスとして表します。アプリケーションで文字と UTF-7 エンコーディングとの間で変換を実行するには、UTF7Encoding クラスを使用します。ASCII 以外の Unicode 文字は、ASCII 文字のエスケープ シーケンスによって表します。

    UTF-7 は、このエンコーディングを必要とするプロトコル (多くの場合、電子メールやニュースグループのプロトコル) をサポートします。ただし、UTF-7 は特に安全でも堅牢でもありません。場合によっては、1 ビットを変更すると、UTF-7 文字列全体の解釈がまったく変わることがあります。他方、異なる UTF-7 文字列がエンコードによって同じテキストになる可能性もあります。ASCII 以外の文字を含むシーケンスの場合、UTF-7 は UTF-8 よりも空間を効率的に使用できず、エンコードとデコードに時間がかかります。したがって、アプリケーションでは一般に UTF-7 より UTF-8 の使用が適しています。

  • ASCII エンコーディング
    ラテン語のアルファベット文字を 1 つの 7 ビット ASCII 文字としてエンコードします。ASCII エンコーディングでは、U+0000 から U+007F までの文字値しかサポートされていないため、ほとんどの場合、国際対応アプリケーションでは ASCII エンコーディングの使用は不適切です。アプリケーションで文字と ASCII エンコーディングとの間で変換を実行するには、ASCIIEncoding クラスを使用します。このクラスをコードで使用する例については、「基本型のエンコーディング」を参照してください。

  • ANSI/ISO エンコーディング
    Unicode 以外のエンコーディングに使用されます。Encoding クラスにより、さまざまな ANSI/ISO エンコーディングがサポートされています。

バイナリ データを文字列として渡す

ランダムな数値のコレクションは、数値がバイトと文字のいずれであっても、有効な文字列または有効な Unicode にはなりません。アプリケーションではバイト配列と Unicode との間で変換を行うことはできず、このような変換は正しく動作しません。一部の文字とコード ポイント シーケンスは Unicode 5.0 では無効であり、それらはいずれの Unicode エンコーディングでも変換できません。アプリケーションがバイナリ データを文字列形式で渡す必要がある場合は、Base 64 またはこの処理を目的とする形式を使用してください。

エンコーディング クラスの使用

アプリケーションで指定したエンコーディングのエンコーディング オブジェクトを返すには、GetEncoding メソッドを使用します。アプリケーションで Unicode 文字列を指定したエンコーディングのバイト表現に変換するには、GetBytes メソッドを使用します。

GetEncoding メソッドを使用して、指定されたコード ページのターゲット エンコーディング オブジェクトを作成するコード例を次に示します。ターゲット エンコーディング オブジェクトで GetBytes メソッドが呼び出され、Unicode 文字列がターゲット エンコーディングのバイト表現に変換されます。指定したコード ページでのこの文字列のバイト表現が表示されます。

Imports System
Imports System.IO
Imports System.Globalization
Imports System.Text

Public Class Encoding_UnicodeToCP
   Public Shared Sub Main()
      ' Converts ASCII characters to bytes.
      ' Displays the string's byte representation in the 
      ' specified code page.
      ' Code page 1252 represents Latin characters.
      PrintCPBytes("Hello, World!", 1252)
      ' Code page 932 represents Japanese characters.
      PrintCPBytes("Hello, World!", 932)
      
      ' Converts Japanese characters.
      PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",1252)
      PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",932)
   End Sub

   Public Shared Sub PrintCPBytes(str As String, codePage As Integer)
      Dim targetEncoding As Encoding
      Dim encodedChars() As Byte      
      
      ' Gets the encoding for the specified code page.
      targetEncoding = Encoding.GetEncoding(codePage)
      
      ' Gets the byte representation of the specified string.
      encodedChars = targetEncoding.GetBytes(str)
      
      ' Prints the bytes.
      Console.WriteLine("Byte representation of '{0}' in CP '{1}':", _
         str, codePage)
      Dim i As Integer
      For i = 0 To encodedChars.Length - 1
         Console.WriteLine("Byte {0}: {1}", i, encodedChars(i))
      Next i
   End Sub
End Class
using System;
using System.IO;
using System.Globalization;
using System.Text;

public class Encoding_UnicodeToCP
{
   public static void Main()
   {
      // Converts ASCII characters to bytes.
      // Displays the string's byte representation in the 
      // specified code page.
      // Code page 1252 represents Latin characters.
      PrintCPBytes("Hello, World!",1252);
      // Code page 932 represents Japanese characters.
      PrintCPBytes("Hello, World!",932);

      // Converts Japanese characters to bytes.
      PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",1252);
      PrintCPBytes("\u307b,\u308b,\u305a,\u3042,\u306d",932);
   }

   public static void PrintCPBytes(string str, int codePage)
   {
      Encoding targetEncoding;
      byte[] encodedChars;

      // Gets the encoding for the specified code page.
      targetEncoding = Encoding.GetEncoding(codePage);

      // Gets the byte representation of the specified string.
      encodedChars = targetEncoding.GetBytes(str);

      // Prints the bytes.
      Console.WriteLine
               ("Byte representation of '{0}' in Code Page  '{1}':", str, 
                  codePage);
      for (int i = 0; i < encodedChars.Length; i++)
               Console.WriteLine("Byte {0}: {1}", i, encodedChars[i]);
   }
}
zs0350fy.alert_note(ja-jp,VS.90).gifメモ :

このコードをコンソール アプリケーションで使用すると、指定した Unicode テキスト要素が正しく表示されないことがあります。これは、コンソール環境での Unicode 文字のサポートが、実行中の Windows オペレーティング システムのバージョンによって異なるためです

ASP.NET アプリケーションでこれらのメソッドを使用すると、応答文字に使用できるエンコーディングを判別できます。アプリケーションでは、ContentEncoding プロパティの値を該当メソッドが返す値に設定する必要があります。HttpResponse.ContentEncoding を設定する方法を次のコード例に示します。

' Explicitly sets ContentEncoding to UTF-8.
Response.ContentEncoding = Encoding.UTF8

' Sets ContentEncoding using the name of an encoding.
Response.ContentEncoding = Encoding.GetEncoding(name)

' Sets ContentEncoding using a code page number.
Response.ContentEncoding = Encoding.GetEncoding(codepageNumber)
// Explicitly sets the encoding to UTF-8.
Response.ContentEncoding = Encoding.UTF8;

// Sets ContentEncoding using the name of an encoding.
Response.ContentEncoding = Encoding.GetEncoding(name);

// Sets ContentEncoding using a code page number.
Response.ContentEncoding = Encoding.GetEncoding(codepageNumber);

ほとんどの ASP.NET アプリケーションでは、ユーザーが期待するエンコーディングでテキストを表示するために、ContentEncoding プロパティと ContentEncoding プロパティを一致させる必要があります。

ASP.NET でエンコーディングを使用する方法の詳細については、「共通タスクのクイック スタート」の複数のエンコーディングに関するサンプルと、「ASP.NET クイック スタート」の、カルチャとエンコーディングの設定に関するサンプルを参照してください。

参照

概念

エンコーディングの理解

.NET Framework での Unicode