IdnMapping.GetAscii 方法

定義

將包含 US-ASCII 字元範圍以外之 Unicode 字元的網域名稱標籤字串,編碼為 US-ASCII 字元範圍 (U+0020 到 U+007E) 中可顯示之 Unicode 字元的字串。 此字串是依據 IDNA 標準來格式化。

多載

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 標準進行格式化。

GetAscii(String)

來源:
IdnMapping.cs
來源:
IdnMapping.cs
來源:
IdnMapping.cs

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

public:
 System::String ^ GetAscii(System::String ^ unicode);
public string GetAscii (string unicode);
member this.GetAscii : string -> string
Public Function GetAscii (unicode As String) As String

參數

unicode
String

要轉換的字串,其包含以標籤分隔符號分隔的一個或多個網域名稱標籤。

傳回

unicode 參數指定的字串的對等用法,以 US-ASCII 字元範圍 (U+0020 到 U+007E) 中可顯示的 Unicode 字元組成,並根據 IDNA 標準進行格式化。

例外狀況

unicodenull

根據 AllowUnassignedUseStd3AsciiRules 屬性以及 IDNA 標準,unicode 無效。

範例

下列範例會 GetAscii(String) 使用 方法,將國際化功能變數名稱的陣列轉換成 Punycode,這是由 US-ASCII 字元範圍中的字元所組成的編碼對等專案。 方法 GetUnicode(String) 接著會將 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

備註

參數 unicode 會指定包含有效 Unicode 字元之一或多個標籤的字串。 標籤會以標籤分隔符號分隔。 參數 unicode 不能以標籤分隔符號開頭,但可以包含並選擇性地以分隔符號結尾。 標籤分隔符號為 FULL STOP (period、U+002E) 、IDEOGRAPHIC FULL STOP (U+3002) 、FULLWIDTH FULL STOP (U+FF0E) ,以及 HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61) 。 例如,功能變數名稱 「www.adatum.com」 包含以句號分隔的標籤 「www」、「adatum」 和 「com」。

標籤不能包含下列任何字元:

方法 GetAscii 會將所有標籤分隔符號轉換成 FULL STOP (句號 U+002E) 。

如果 unicode 不包含 US-ASCII 字元範圍以外的字元,而且禁止 US-ASCII 字元範圍中的字元,則方法會 unicode 傳回未變更。

給呼叫者的注意事項

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

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

適用於

GetAscii(String, Int32)

來源:
IdnMapping.cs
來源:
IdnMapping.cs
來源:
IdnMapping.cs

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

public:
 System::String ^ GetAscii(System::String ^ unicode, int index);
public string GetAscii (string unicode, int index);
member this.GetAscii : string * int -> string
Public Function GetAscii (unicode As String, index As Integer) As String

參數

unicode
String

要轉換的字串,其包含以標籤分隔符號分隔的一個或多個網域名稱標籤。

index
Int32

針對 unicode 以零為起始的位移,指定要轉換的子字串起點。 轉換作業會持續到 unicode 字串尾端。

傳回

unicodeindex 參數指定的子字串的對等用法,以 US-ASCII 字元範圍 (U+0020 到 U+007E) 中可顯示的 Unicode 字元組成,並根據 IDNA 標準進行格式化。

例外狀況

unicodenull

index 小於零。

-或-

index 大於 unicode 的長度。

根據 AllowUnassignedUseStd3AsciiRules 屬性以及 IDNA 標準,unicode 無效。

備註

unicodeindex 參數會使用包含有效 Unicode 字元的一或多個標籤來定義子字串。 標籤會以標籤分隔符號分隔。 子字串的第一個字元不能以標籤分隔符號開頭,但可以包含並選擇性地以分隔符號結尾。 標籤分隔符號為 FULL STOP (period、U+002E) 、IDEOGRAPHIC FULL STOP (U+3002) 、FULLWIDTH FULL STOP (U+FF0E) ,以及 HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61) 。 例如,功能變數名稱 「www.adatum.com」 包含以句號分隔的標籤 「www」、「adatum」 和 「com」。

標籤不能包含下列任何字元:

方法 GetAscii 會將所有標籤分隔符號轉換成 FULL STOP (句號 U+002E) 。

如果 unicode 不包含 US-ASCII 字元範圍以外的字元,而且禁止 US-ASCII 字元範圍中的字元,則方法會 unicode 傳回未變更。

給呼叫者的注意事項

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

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

適用於

GetAscii(String, Int32, Int32)

來源:
IdnMapping.cs
來源:
IdnMapping.cs
來源:
IdnMapping.cs

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

public:
 System::String ^ GetAscii(System::String ^ unicode, int index, int count);
public string GetAscii (string unicode, int index, int count);
member this.GetAscii : string * int * int -> string
Public Function GetAscii (unicode As String, index As Integer, count As Integer) As String

參數

unicode
String

要轉換的字串,其包含以標籤分隔符號分隔的一個或多個網域名稱標籤。

index
Int32

針對 unicode 以零起始的位移,指定子字串起點。

count
Int32

子字串中要轉換的字元數,此子字串從 unicode 字串中 index 所指定的位置開始。

傳回

unicodeindexcount 參數指定的子字串對等用法,其包含 US-ASCII 字元範圍 (U+0020 到 U+007E) 中可顯示的 Unicode 字元組成,並根據 IDNA 標準進行格式化。

例外狀況

unicodenull

indexcount 小於零。

-或-

index 大於 unicode 的長度。

-或-

index 大於 unicode 減去 count 之後的長度。

根據 AllowUnassignedUseStd3AsciiRules 屬性以及 IDNA 標準,unicode 無效。

範例

下列範例會 GetAscii(String, Int32, Int32) 使用 方法,將國際化功能變數名稱轉換為符合 IDNA 標準的功能變數名稱。 方法 GetUnicode(String, Int32, Int32) 接著會將標準化功能變數名稱轉換回原始功能變數名稱,但會將原始標籤分隔符號取代為標準標籤分隔符號。

// This example demonstrates the GetAscii and GetUnicode methods.
// For sake of illustration, this example uses the most complex
// form of those methods, not the most convenient.

using System;
using System.Globalization;

class Sample
{
    public static void Main()
    {
/*
   Define a domain name consisting of the labels: GREEK SMALL LETTER
   PI (U+03C0); IDEOGRAPHIC FULL STOP (U+3002); GREEK SMALL LETTER
   THETA (U+03B8); FULLWIDTH FULL STOP (U+FF0E); and "com".
*/
    string name = "\u03C0\u3002\u03B8\uFF0Ecom";
    string international;
    string nonInternational;

    string msg1 = "the original non-internationalized \ndomain name:";
    string msg2 = "Allow unassigned characters?:     {0}";
    string msg3 = "Use non-internationalized rules?: {0}";
    string msg4 = "Convert the non-internationalized domain name to international format...";
    string msg5 = "Display the encoded domain name:\n\"{0}\"";
    string msg6 = "the encoded domain name:";
    string msg7 = "Convert the internationalized domain name to non-international format...";
    string msg8 = "the reconstituted non-internationalized \ndomain name:";
    string msg9 = "Visually compare the code points of the reconstituted string to the " +
                  "original.\n" +
                  "Note that the reconstituted string contains standard label " +
                  "separators (U+002e).";
// ----------------------------------------------------------------------------
    CodePoints(name, msg1);
// ----------------------------------------------------------------------------

    IdnMapping idn = new IdnMapping();

    Console.WriteLine(msg2, idn.AllowUnassigned);
    Console.WriteLine(msg3, idn.UseStd3AsciiRules);
    Console.WriteLine();
// ----------------------------------------------------------------------------
    Console.WriteLine(msg4);
    international = idn.GetAscii(name, 0, name.Length);
    Console.WriteLine(msg5, international);
    Console.WriteLine();
    CodePoints(international, msg6);
// ----------------------------------------------------------------------------
    Console.WriteLine(msg7);
    nonInternational = idn.GetUnicode(international, 0, international.Length);
    CodePoints(nonInternational, msg8);
    Console.WriteLine(msg9);
    }
// ----------------------------------------------------------------------------
    static void CodePoints(string value, string title)
    {
    Console.WriteLine("Display the Unicode code points of {0}", title);
    foreach (char c in value)
        {
        Console.Write("{0:x4} ", Convert.ToInt32(c));
        }
        Console.WriteLine();
        Console.WriteLine();
    }
}
/*
This code example produces the following results:

Display the Unicode code points of the original non-internationalized
domain name:
03c0 3002 03b8 ff0e 0063 006f 006d

Allow unassigned characters?:     False
Use non-internationalized rules?: False

Convert the non-internationalized domain name to international format...
Display the encoded domain name:
"xn--1xa.xn--txa.com"

Display the Unicode code points of the encoded domain name:
0078 006e 002d 002d 0031 0078 0061 002e 0078 006e 002d 002d 0074 0078 0061 002e 0063 006f
006d

Convert the internationalized domain name to non-international format...
Display the Unicode code points of the reconstituted non-internationalized
domain name:
03c0 002e 03b8 002e 0063 006f 006d

Visually compare the code points of the reconstituted string to the original.
Note that the reconstituted string contains standard label separators (U+002e).

*/
' This example demonstrates the GetAscii and GetUnicode methods.
' For sake of illustration, this example uses the most complex
' form of those methods, not the most convenient.

Imports System.Globalization

Class Sample
    Public Shared Sub Main()

'   Define a domain name consisting of the labels: GREEK SMALL LETTER
'   PI (U+03C0); IDEOGRAPHIC FULL STOP (U+3002); GREEK SMALL LETTER
'   THETA (U+03B8); FULLWIDTH FULL STOP (U+FF0E); and "com".

        Dim name As String = "π。θ.com"
        Dim international As String
        Dim nonInternational As String

        Dim msg1 As String = "the original non-internationalized " & vbCrLf & "domain name:"
        Dim msg2 As String = "Allow unassigned characters?:     {0}"
        Dim msg3 As String = "Use non-internationalized rules?: {0}"
        Dim msg4 As String = "Convert the non-internationalized domain name to international format..."
        Dim msg5 As String = "Display the encoded domain name:" & vbCrLf & """{0}"""
        Dim msg6 As String = "the encoded domain name:"
        Dim msg7 As String = "Convert the internationalized domain name to non-international format..."
        Dim msg8 As String = "the reconstituted non-internationalized " & vbCrLf & "domain name:"
        Dim msg9 As String = "Visually compare the code points of the reconstituted string to the " & _
                             "original." & vbCrLf & _
                             "Note that the reconstituted string contains standard label " & _
                             "separators (U+002e)."
        ' ----------------------------------------------------------------------------
        CodePoints(name, msg1)
        ' ----------------------------------------------------------------------------
        Dim idn As New IdnMapping()

        Console.WriteLine(msg2, idn.AllowUnassigned)
        Console.WriteLine(msg3, idn.UseStd3AsciiRules)
        Console.WriteLine()
        ' ----------------------------------------------------------------------------
        Console.WriteLine(msg4)
        international = idn.GetAscii(name, 0, name.Length)
        Console.WriteLine(msg5, international)
        Console.WriteLine()
        CodePoints(international, msg6)
        ' ----------------------------------------------------------------------------
        Console.WriteLine(msg7)
        nonInternational = idn.GetUnicode(international, 0, international.Length)
        CodePoints(nonInternational, msg8)
        Console.WriteLine(msg9)
    End Sub

    ' ----------------------------------------------------------------------------
    Shared Sub CodePoints(ByVal value As String, ByVal title As String)
        Console.WriteLine("Display the Unicode code points of {0}", title)
        Dim c As Char
        For Each c In  value
            Console.Write("{0:x4} ", Convert.ToInt32(c))
        Next c
        Console.WriteLine()
        Console.WriteLine()

    End Sub
End Class
'
'This code example produces the following results:
'
'Display the Unicode code points of the original non-internationalized
'domain name:
'03c0 3002 03b8 ff0e 0063 006f 006d
'
'Allow unassigned characters?:     False
'Use non-internationalized rules?: False
'
'Convert the non-internationalized domain name to international format...
'Display the encoded domain name:
'"xn--1xa.xn--txa.com"
'
'Display the Unicode code points of the encoded domain name:
'0078 006e 002d 002d 0031 0078 0061 002e 0078 006e 002d 002d 0074 0078 0061 002e 0063 006f
'006d
'
'Convert the internationalized domain name to non-international format...
'Display the Unicode code points of the reconstituted non-internationalized
'domain name:
'03c0 002e 03b8 002e 0063 006f 006d
'
'Visually compare the code points of the reconstituted string to the original.
'Note that the reconstituted string contains standard label separators (U+002e).
'

備註

Unicodeindexcount 參數會使用包含有效 Unicode 字元的一或多個標籤來定義子字串。 標籤會以標籤分隔符號分隔。 子字串的第一個字元不能以標籤分隔符號開頭,但可以包含並選擇性地以分隔符號結尾。 標籤分隔符號為 FULL STOP (period、U+002E) 、IDEOGRAPHIC FULL STOP (U+3002) 、FULLWIDTH FULL STOP (U+FF0E) ,以及 HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61) 。 例如,功能變數名稱 「www.adatum.com」 包含以句號分隔的標籤 「www」、「adatum」 和 「com」。

標籤不能包含下列任何字元:

方法 GetAscii 會將所有標籤分隔符號轉換成 FULL STOP (句號 U+002E) 。 如果子字串不包含 US-ASCII 字元範圍以外的字元,而且禁止 US-ASCII 字元範圍內的字元,此方法會傳回未變更的子字串。

給呼叫者的注意事項

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

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

適用於