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 機制僅用來轉換功能變數名稱,而非透過因特網傳輸的數據。

重要

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

如需這些標準處理特定字元集的方式差異,請參閱 Unicode 技術標準 #46:IDNA 相容性處理

方法 IdnMapping.GetAscii 會將域名正規化、將標準化名稱轉換成表示法,此表示法是由 US-ASCII 字碼指標範圍中可顯示的 Unicode 字元所組成, (U+0020 到 U+007E) ,並在每個捲標前面加上 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)

將網域名稱標籤的字串 (包含 Unicode 字元) 編碼為 US-ASCII 字元範圍中可顯示的 Unicode 字元字串。 此字串是依據 IDNA 標準來格式化。

GetAscii(String, Int32)

將包含 US-ASCII 字元範圍以外之 Unicode 字元的網域名稱標籤子字串編碼。 子字串會轉換成 US-ASCII 字元範圍中可顯示的 Unicode 字元,並根據 IDNA 標準進行格式化。

GetAscii(String, Int32, Int32)

在包含US-ASCII字元範圍外 Unicode 字元的功能變數名稱捲標子字串中,編碼指定的字元數。 子字串會轉換成 US-ASCII 字元範圍中可顯示的 Unicode 字元,並根據 IDNA 標準進行格式化。

GetHashCode()

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

GetType()

取得目前執行個體的 Type

(繼承來源 Object)
GetUnicode(String)

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

GetUnicode(String, Int32)

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

GetUnicode(String, Int32, Int32)

將根據 IDNA 標準編碼的一個或多個網域名稱標籤的指定長度子字串,解碼為 Unicode 字元字串。

MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
ToString()

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

(繼承來源 Object)

適用於

執行緒安全性

的所有公用方法 IdnMapping 都是安全線程,而且只要實例的屬性未同時設定, IdnMapping 就可以從多個線程同時使用。

另請參閱