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

備註

網際網路網域名稱由一個或多個稱為網域名稱標籤的部分組成,這些部分之間由標籤分隔符分隔。 例如,網域名稱「www.proseware.com」由標籤「www」、「proseware」和「com」組成,並以句點分隔。 標準網域名稱由 US-ASCII(或基本拉丁)字元範圍的指定字元組成,範圍從 U+0021 到 U+007E。 為了方便不使用 US-ASCII 字元集的文化中的網際網路使用,2003 年通過了「應用程式國際化網域名稱」(IDNA)標準,以支援包含 Unicode 字元範圍外的 US-ASCII 字元。 然而,名稱伺服器和網域名稱解析仍然依賴 US-ASCII 字元範圍內的字元。

IDNA 機制利用 Punycode 將包含 US-ASCII Unicode 字元範圍外的國際化網域名稱,映射到網域名稱系統支援的 US-ASCII 字元範圍。 IDNA 機制僅用於轉換網域名稱,而非透過網際網路傳輸的資料。

Important

在 .NET Framework 4.5 中,該 IdnMapping 類別支援不同版本的 IDNA 標準,視所使用的作業系統而定:

請參閱 Unicode 技術標準 #46:IDNA 相容處理 ,了解這些標準處理特定字元集的差異。

此方法對 IdnMapping.GetAscii 網域名稱進行正規化,將正規化後的名稱轉換為由可顯示 Unicode 字元組成的表示法,該字元範圍為 US-ASCII 碼點範圍(U+0020 至 U+007E),並在每個標籤前加上相容 ASCII 編碼(ACE)前綴(「xn--」)。 此 IdnMapping.GetUnicode 方法會恢復由該 GetAscii 方法轉換的網域名稱標籤。

若要轉換的字串包含標籤分隔符字元U��OGRAPHIC FULL STOP (U+3002)、FULLWIDTH FULL STOP (U+FF0E) 和 HALFWIDTH �� HUOGRAPHIC FULL STOP (U+FF61), GetAscii 該方法會將它們轉換為標籤分隔符 FULL Stop (句號,U+002E)。 然而,此 GetUnicode 方法並未恢復原本的標籤分隔符字元。

建構函式

名稱 Description
IdnMapping()

初始化 IdnMapping 類別的新執行個體。

屬性

名稱 Description
AllowUnassigned

取得或設定一個值,指示當前物件成員 IdnMapping 執行操作時是否使用未指派的 Unicode 碼點。

UseStd3AsciiRules

取得或設定一個值,表示當前物件成員 IdnMapping 執行的操作中,是否使用標準命名或寬鬆命名慣例。

方法

名稱 Description
Equals(Object)

表示指定物件與當前 IdnMapping 物件是否相等。

GetAscii(String, Int32, Int32)

編碼指定字元數的子串,包含 US-ASCII 包含 Unicode 字元範圍外的 Unicode 字元。 子字串會轉換成一串可顯示的 Unicode 字元,且以 US-ASCII 字元範圍,並依照 IDNA 標準格式化。

GetAscii(String, Int32)

編碼包含 US-ASCII Unicode 字元範圍外的 Unicode 字元的網域名稱標籤子串。 子字串會轉換成一串可顯示的 Unicode 字元,且以 US-ASCII 字元範圍,並依照 IDNA 標準格式化。

GetAscii(String)

將一串由 Unicode 字元組成的網域名稱標籤串編碼成一串可顯示的 Unicode 字元,範圍為 US-ASCII。 字串依照 IDNA 標準格式化。

GetHashCode()

會回傳這個 IdnMapping 物件的雜湊碼。

GetType()

取得目前實例的 Type

(繼承來源 Object)
GetUnicode(String, Int32, Int32)

解碼一個長度指定、包含一個或多個網域名稱標籤的子串,依照 IDNA 標準編碼,並以 Unicode 字元串形式編碼。

GetUnicode(String, Int32)

將一個或多個依 IDNA 標準編碼的網域名稱標籤子串解碼成一串 Unicode 字元。

GetUnicode(String)

將一串或多個依據 IDNA 標準編碼的網域名稱標籤串解碼成一串 Unicode 字元。

MemberwiseClone()

建立目前 Object的淺層複本。

(繼承來源 Object)
ToString()

傳回表示目前 物件的字串。

(繼承來源 Object)
TryGetAscii(ReadOnlySpan<Char>, Span<Char>, Int32)

支援使用非 ASCII 字元作為網際網路網域名稱。 無法繼承這個類別。

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

支援使用非 ASCII 字元作為網際網路網域名稱。 無法繼承這個類別。

適用於

執行緒安全性

所有公開方法 IdnMapping 皆為執行緒安全,且可同時從多個執行緒使用,只要 IdnMapping 該實例的屬性不同時設定。

另請參閱