IdnMapping クラス

定義

インターネット ドメイン名に対する ASCII 以外の文字の使用をサポートします。 このクラスは継承できません。

public ref class IdnMapping sealed
public sealed class IdnMapping
type IdnMapping = class
Public NotInheritable Class IdnMapping
継承
IdnMapping

次の例では、 GetAscii(String, Int32, Int32) メソッドを使用して、国際化ドメイン名の配列を Punycode に変換します。 その後、 GetUnicode メソッドは Punycode ドメイン名を元のドメイン名に変換しますが、元のラベル区切り記号を標準のラベル区切り記号に置き換えます。

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      string[] names = { "bücher.com", "мойдомен.рф", "παράδειγμα.δοκιμή",
                         "mycharity\u3002org",
                         "prose\u0000ware.com", "proseware..com", "a.org",
                         "my_company.com" };
      IdnMapping idn = new IdnMapping();

      foreach (var name in names) {
         try {
            string punyCode = idn.GetAscii(name);
            string name2 = idn.GetUnicode(punyCode);
            Console.WriteLine("{0} --> {1} --> {2}", name, punyCode, name2);
            Console.WriteLine("Original: {0}", ShowCodePoints(name));
            Console.WriteLine("Restored: {0}", ShowCodePoints(name2));
         }
         catch (ArgumentException) {
            Console.WriteLine("{0} is not a valid domain name.", name);
         }
         Console.WriteLine();
      }
   }

   private static string ShowCodePoints(string str1)
   {
      string output = "";
      foreach (var ch in str1)
         output += $"U+{(ushort)ch:X4} ";

      return output;
   }
}
// The example displays the following output:
//    bücher.com --> xn--bcher-kva.com --> bücher.com
//    Original: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
//    Restored: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
//
//    мойдомен.рф --> xn--d1acklchcc.xn--p1ai --> мойдомен.рф
//    Original: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
//    Restored: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
//
//    παράδειγμα.δοκιμή --> xn--hxajbheg2az3al.xn--jxalpdlp --> παράδειγμα.δοκιμή
//    Original: U+03C0 U+03B1 U+03C1 U+03AC U+03B4 U+03B5 U+03B9 U+03B3 U+03BC U+03B1 U+002E U+03B4 U+03BF U+03BA U+03B9 U+03BC U+03AE
//    Restored: U+03C0 U+03B1 U+03C1 U+03AC U+03B4 U+03B5 U+03B9 U+03B3 U+03BC U+03B1 U+002E U+03B4 U+03BF U+03BA U+03B9 U+03BC U+03AE
//
//    mycharity。org --> mycharity.org --> mycharity.org
//    Original: U+006D U+0079 U+0063 U+0068 U+0061 U+0072 U+0069 U+0074 U+0079 U+3002 U+006F U+0072 U+0067
//    Restored: U+006D U+0079 U+0063 U+0068 U+0061 U+0072 U+0069 U+0074 U+0079 U+002E U+006F U+0072 U+0067
//
//    prose ware.com is not a valid domain name.
//
//    proseware..com is not a valid domain name.
//
//    a.org --> a.org --> a.org
//    Original: U+0061 U+002E U+006F U+0072 U+0067
//    Restored: U+0061 U+002E U+006F U+0072 U+0067
//
//    my_company.com --> my_company.com --> my_company.com
//    Original: U+006D U+0079 U+005F U+0063 U+006F U+006D U+0070 U+0061 U+006E U+0079 U+002E U+0063 U+006F U+006D
//    Restored: U+006D U+0079 U+005F U+0063 U+006F U+006D U+0070 U+0061 U+006E U+0079 U+002E U+0063 U+006F U+006D
Imports System.Globalization

Module Example
   Public Sub Main()
      Dim names() As String = { "bücher.com", "мойдомен.рф", "παράδειγμα.δοκιμή",
                                "mycharity" + ChrW(&h3002) + "org",
                                "prose" + ChrW(0) + "ware.com", "proseware..com", "a.org", 
                                "my_company.com" }
      Dim idn As New IdnMapping()
      
      For Each name In names
         Try
            Dim punyCode As String = idn.GetAscii(name)
            Dim name2 As String = idn.GetUnicode(punyCode)
            Console.WriteLine("{0} --> {1} --> {2}", name, punyCode, name2) 
            Console.WriteLine("Original: {0}", ShowCodePoints(name))
            Console.WriteLine("Restored: {0}", ShowCodePoints(name2))
         Catch e As ArgumentException 
            Console.WriteLine("{0} is not a valid domain name.", name)
         End Try
         Console.WriteLine()
      Next   
   End Sub
   
   Private Function ShowCodePoints(str1 As String) As String
      Dim output As String = ""
      For Each ch In str1
         output += String.Format("U+{0} ", Convert.ToUInt16(ch).ToString("X4"))
      Next
      Return output
   End Function
End Module
' The example displays the following output:
'    bücher.com --> xn--bcher-kva.com --> bücher.com
'    Original: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
'    Restored: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
'    
'    мойдомен.рф --> xn--d1acklchcc.xn--p1ai --> мойдомен.рф
'    Original: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
'    Restored: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
'    
'    παράδειγμα.δοκιμή --> xn--hxajbheg2az3al.xn--jxalpdlp --> παράδειγμα.δοκιμή
'    Original: U+03C0 U+03B1 U+03C1 U+03AC U+03B4 U+03B5 U+03B9 U+03B3 U+03BC U+03B1 U+002E U+03B4 U+03BF U+03BA U+03B9 U+03BC U+03AE
'    Restored: U+03C0 U+03B1 U+03C1 U+03AC U+03B4 U+03B5 U+03B9 U+03B3 U+03BC U+03B1 U+002E U+03B4 U+03BF U+03BA U+03B9 U+03BC U+03AE
'    
'    mycharity。org --> mycharity.org --> mycharity.org
'    Original: U+006D U+0079 U+0063 U+0068 U+0061 U+0072 U+0069 U+0074 U+0079 U+3002 U+006F U+0072 U+0067
'    Restored: U+006D U+0079 U+0063 U+0068 U+0061 U+0072 U+0069 U+0074 U+0079 U+002E U+006F U+0072 U+0067
'    
'    prose ware.com is not a valid domain name.
'    
'    proseware..com is not a valid domain name.
'    
'    a.org --> a.org --> a.org
'    Original: U+0061 U+002E U+006F U+0072 U+0067
'    Restored: U+0061 U+002E U+006F U+0072 U+0067
'    
'    my_company.com --> my_company.com --> my_company.com
'    Original: U+006D U+0079 U+005F U+0063 U+006F U+006D U+0070 U+0061 U+006E U+0079 U+002E U+0063 U+006F U+006D
'    Restored: U+006D U+0079 U+005F U+0063 U+006F U+006D U+0070 U+0061 U+006E U+0079 U+002E U+0063 U+006F U+006D

注釈

インターネット ドメイン名は、ドメイン名ラベルと呼ばれる 1 つ以上の部分で構成され、ラベル区切り記号で区切られます。 たとえば、ドメイン名 "www.proseware.com" は、ピリオドで区切られたラベル "www"、"proseware"、および "com" で構成されます。 標準ドメイン名は、U+0021 から U+007E までの US-ASCII (または Basic Latin) 文字範囲で指定された文字で構成されます。 US-ASCII 文字セットを使用しないカルチャでのインターネットの使用を容易にするために、2003 年には、US-ASCII 文字範囲外の Unicode 文字の包含をサポートするために、アプリケーションでのドメイン名の国際化 (IDNA) 標準が採用されました。 ただし、ネーム サーバーとドメイン名解決は、US-ASCII 文字範囲内の文字に依存し続けます。

IDNA メカニズムでは、Punycode を使用して、US-ASCII 文字範囲外の Unicode 文字を含む国際化ドメイン名を、ドメイン ネーム システムでサポートされている US-ASCII 文字範囲にマップします。 IDNA メカニズムは、インターネット経由で送信されるデータではなく、ドメイン名のみを変換するために使用されます。

Important

.NET Framework 4.5 では、 IdnMapping クラスは、使用中のオペレーティング システムに応じて、さまざまなバージョンの IDNA 標準をサポートしています。

これらの標準が特定の文字セットを処理する方法の違いについては、「 Unicode Technical Standard #46: IDNA 互換性処理 」を参照してください。

IdnMapping.GetAsciiメソッドはドメイン名を正規化し、正規化された名前を、US-ASCII コード ポイント範囲 (U+0020 から U+007E) の表示可能な Unicode 文字で構成される表現に変換し、各ラベルに ASCII 互換エンコード (ACE) プレフィックス ("xn-") を付加します。 IdnMapping.GetUnicode メソッドは、GetAscii メソッドによって変換されたドメイン名ラベルを復元します。

変換する文字列にラベル区切り文字 IDEOGRAPHIC FULL STOP (U+3002)、FULLWIDTH FULL STOP (U+FF0E)、HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61) が含まれている場合、 GetAscii メソッドはラベル区切り記号 FULL STOP (ピリオド、U+002E) に変換します。 ただし、 GetUnicode メソッドでは、元のラベル区切り文字は復元されません。

コンストラクター

名前 説明
IdnMapping()

IdnMapping クラスの新しいインスタンスを初期化します。

プロパティ

名前 説明
AllowUnassigned

現在の IdnMapping オブジェクトのメンバーによって実行される操作で、割り当てられていない Unicode コード ポイントを使用するかどうかを示す値を取得または設定します。

UseStd3AsciiRules

現在の IdnMapping オブジェクトのメンバーによって実行される操作で標準または緩やかな名前付け規則を使用するかどうかを示す値を取得または設定します。

メソッド

名前 説明
Equals(Object)

指定したオブジェクトと現在の IdnMapping オブジェクトが等しいかどうかを示します。

GetAscii(String, Int32, Int32)

ドメイン名ラベルの部分文字列に含まれる、US-ASCII 文字範囲外の Unicode 文字を含む指定した文字数をエンコードします。 部分文字列は、US-ASCII 文字範囲内の表示可能な Unicode 文字の文字列に変換され、IDNA 標準に従って書式設定されます。

GetAscii(String, Int32)

US-ASCII 文字範囲外の Unicode 文字を含むドメイン名ラベルの部分文字列をエンコードします。 部分文字列は、US-ASCII 文字範囲内の表示可能な Unicode 文字の文字列に変換され、IDNA 標準に従って書式設定されます。

GetAscii(String)

Unicode 文字で構成されるドメイン名ラベルの文字列を、US-ASCII 文字範囲内の表示可能な Unicode 文字の文字列にエンコードします。 文字列は IDNA 標準に従って書式設定されます。

GetHashCode()

この IdnMapping オブジェクトのハッシュ コードを返します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
GetUnicode(String, Int32, Int32)

IDNA 標準に従ってエンコードされた 1 つ以上のドメイン名ラベルを含む、指定された長さの部分文字列を Unicode 文字の文字列にデコードします。

GetUnicode(String, Int32)

IDNA 標準に従ってエンコードされた 1 つ以上のドメイン名ラベルの部分文字列を Unicode 文字の文字列にデコードします。

GetUnicode(String)

IDNA 標準に従ってエンコードされた 1 つ以上のドメイン名ラベルの文字列を Unicode 文字の文字列にデコードします。

MemberwiseClone()

現在の Objectの簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)
TryGetAscii(ReadOnlySpan<Char>, Span<Char>, Int32)

インターネット ドメイン名に対する ASCII 以外の文字の使用をサポートします。 このクラスは継承できません。

TryGetUnicode(ReadOnlySpan<Char>, Span<Char>, Int32)

インターネット ドメイン名に対する ASCII 以外の文字の使用をサポートします。 このクラスは継承できません。

適用対象

スレッド セーフ

IdnMappingのすべてのパブリック メソッドはスレッド セーフであり、IdnMapping インスタンスのプロパティも同時に設定されていない限り、複数のスレッドから同時に使用できます。

こちらもご覧ください