IdnMapping 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
網際網路網域名稱支援使用非 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 標準,視使用的作業系統而定:
- 在 Windows 8 上執行時,它支援 RFC 5891 所概述的 2008 版 IDNA 標準:IDNA (IDNA) :通訊協定中的國際化功能變數名稱。
- 在舊版 Windows 作業系統上執行時,它支援 RFC 3490 所概述的 2003 版標準 :將應用程式中的域名國際化 (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 就可以從多個線程同時使用。