IdnMapping.GetAscii 方法

定义

将包含 US-ASCII 字符范围以外的Unicode字符的域名称标签字符串编码为(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)

Source:
IdnMapping.cs
Source:
IdnMapping.cs
Source:
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 (句点、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)

Source:
IdnMapping.cs
Source:
IdnMapping.cs
Source:
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 (句点、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)

Source:
IdnMapping.cs
Source:
IdnMapping.cs
Source:
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 (句点、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 兼容性处理

适用于