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 機制僅用於轉換網域名稱,而非透過網際網路傳輸的資料。
Important
在 .NET Framework 4.5 中,該 IdnMapping 類別支援不同版本的 IDNA 標準,視所使用的作業系統而定:
- 在 Windows 8 上執行時,支援 2008 年版 IDNA 標準,該標準由 RFC 5891:國際化應用程式(IDNA):協議所規範。
- 在較早期版本的 Windows 作業系統上執行時,支援 RFC 3490 所制定的 2003 年版標準:應用程式中的域名國際化(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 該實例的屬性不同時設定。