IdnMapping 类

定义

支持在 Internet 域名中使用非 ASCII 字符。Supports the use of non-ASCII characters for Internet domain names. 此类不能被继承。This class cannot be inherited.

public ref class IdnMapping sealed
public sealed class IdnMapping
type IdnMapping = class
Public NotInheritable Class IdnMapping
继承
IdnMapping

示例

下面的GetAscii(String, Int32, Int32)示例使用方法将国际化域名数组转换为 Punycode。The following example uses the GetAscii(String, Int32, Int32) method to convert an array of internationalized domain names to Punycode. 然后GetUnicode , 方法将 Punycode 域名转换回原始域名, 但将原始标签分隔符替换为标准标签分隔符。The GetUnicode method then converts the Punycode domain name back to the original domain name, but replaces the original label separators with the standard label separator.

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 += String.Format("U+{0} ", Convert.ToUInt16(ch).ToString("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

注解

Internet 域名由一个或多个名为 "域名标签" 的部分组成, 用标签分隔符分隔。An Internet domain name consists of one or more parts, called domain name labels, separated by label separators. 例如, 域名 "www.proseware.com" 由句点分隔的标签 "www"、"proseware" 和 "com" 组成。For example, the domain name "www.proseware.com" consists of the labels, "www", "proseware", and "com", separated by periods. 标准域名由 US-ASCII (或基本拉丁) 字符范围中的指定字符 (从 U + 0021 到 U + 007E) 组成。Standard domain names consist of designated characters in the US-ASCII (or Basic Latin) character range, from U+0021 to U+007E. 为了便于不使用 US-ASCII 字符集的区域性中使用 Internet, 在2003中采用了国际化域名 (IDNA) 标准, 以支持在 US-ASCII 字符范围外包含 Unicode 字符。To facilitate Internet usage in cultures that do not use the US-ASCII character set, the Internationalizing Domain Names in Applications (IDNA) standard was adopted in 2003 to support the inclusion of Unicode characters outside the US-ASCII character range. 但是, 名称服务器和域名解析继续依赖于 US-ASCII 字符范围内的字符。However, name servers and domain name resolution continue to rely on characters within the US-ASCII character range.

IDNA 机制使用 Punycode 将包含 US-ASCII 字符范围以外的 Unicode 字符的国际化域名映射到域名系统支持的 US-ASCII 字符范围。The IDNA mechanism uses Punycode to map an internationalized domain name that contains Unicode characters outside the US-ASCII character range to the US-ASCII character range supported by the domain name system. IDNA 机制仅用于转换域名, 而不会转换通过 Internet 传输的数据。The IDNA mechanism is used to convert only domain names, not data transmitted over the Internet.

重要

在中.NET Framework 4.5.NET Framework 4.5 IdnMapping , 类支持 IDNA 标准的不同版本, 具体取决于所使用的操作系统:In the .NET Framework 4.5.NET Framework 4.5, the IdnMapping class supports different versions of the IDNA standard, depending on the operating system in use:

参阅 Unicode 技术标准 #46:IDNA 兼容性处理这些标准处理特定字符集的方式。See Unicode Technical Standard #46: IDNA Compatibility Processing for the differences in the way these standards handle particular sets of characters.

IdnMapping.GetAscii方法规范化域名, 将规范化名称转换为一个表示形式, 该表示形式由 us-ascii 码位范围内的可显示 Unicode 字符 (u + 0020 到 U + 007E) 组成, 并前面加上一个与 ascii 兼容的编码 (ACE) 前缀 ("xn--") 添加到每个标签。The IdnMapping.GetAscii method normalizes a domain name, converts the normalized name to a representation that consists of displayable Unicode characters in the US-ASCII code point range (U+0020 to U+007E), and prepends an ASCII-compatible encoding (ACE) prefix ("xn--") to each label. IdnMapping.GetUnicode方法还原GetAscii由方法转换的域名标签。The IdnMapping.GetUnicode method restores the domain name labels converted by the GetAscii method.

如果要转换的字符串包括标签分隔符字符表意字句号 (u + 3002)、全半形句号 (u + FF0E) 和半形象形字句号 (u + FF61), 则GetAscii方法将它们转换为标签分隔符 full stop (period, U +002E).If the string to be converted includes the label separator characters IDEOGRAPHIC FULL STOP (U+3002), FULLWIDTH FULL STOP (U+FF0E), and HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61), the GetAscii method converts them to the label separator FULL STOP (period, U+002E). 但是GetUnicode , 方法不会还原原始标签分隔符。The GetUnicode method, however, does not restore the original label separator character.

构造函数

IdnMapping()

初始化 IdnMapping 类的新实例。Initializes a new instance of the IdnMapping class.

属性

AllowUnassigned

获取或设置一个值,该值指示当前 IdnMapping 对象的成员所执行的操作中是否使用未分配的 Unicode 码位。Gets or sets a value that indicates whether unassigned Unicode code points are used in operations performed by members of the current IdnMapping object.

UseStd3AsciiRules

获取或设置一个值,该值指示在当前 IdnMapping 对象的成员所执行的操作中是使用标准命名约定还是宽松命名约定。Gets or sets a value that indicates whether standard or relaxed naming conventions are used in operations performed by members of the current IdnMapping object.

方法

Equals(Object)

指示当前 IdnMapping 对象与指定对象是否相等。Indicates whether a specified object and the current IdnMapping object are equal.

GetAscii(String)

将由 Unicode 字符组成的域名标签的字符串编码为 US-ASCII 字符范围内的可显示的 Unicode 字符的字符串。Encodes a string of domain name labels that consist of Unicode characters to a string of displayable Unicode characters in the US-ASCII character range. 根据 IDNA 标准格式化的字符串。The string is formatted according to the IDNA standard.

GetAscii(String, Int32)

编码包含US-ASCII字符范围以外的 Unicode 字符的域名称标签子字符串。Encodes a substring of domain name labels that include Unicode characters outside the US-ASCII character range. 子串转换为在 US-ASCII 字符范围内可显示的“ Unicode ”字符串并根据 IDNA 标准格式化。The substring is converted to a string of displayable Unicode characters in the US-ASCII character range and is formatted according to the IDNA standard.

GetAscii(String, Int32, Int32)

编码包含 US-ASCII 字符范围以外的 Unicode 字符的域名称标签子字符串的指定字符数。Encodes the specified number of characters in a substring of domain name labels that include Unicode characters outside the US-ASCII character range. 子串转换为在 US-ASCII 字符范围内可显示的“ Unicode ”字符串并根据 IDNA 标准格式化。The substring is converted to a string of displayable Unicode characters in the US-ASCII character range and is formatted according to the IDNA standard.

GetHashCode()

返回此 IdnMapping 对象的哈希代码。Returns a hash code for this IdnMapping object.

GetType()

获取当前实例的 TypeGets the Type of the current instance.

(继承自 Object)
GetUnicode(String)

对基于 IDNA 标准编码的一个或者多个域名标签的字符串进行解码,解码为一个 Unicode 字符串。Decodes a string of one or more domain name labels, encoded according to the IDNA standard, to a string of Unicode characters.

GetUnicode(String, Int32)

对基于 IDNA 标准编码的一个或者多个域名标签的子字符串进行解码,解码为 Unicode 字符串。Decodes a substring of one or more domain name labels, encoded according to the IDNA standard, to a string of Unicode characters.

GetUnicode(String, Int32, Int32)

对基于 IDNA 标准编码、具有指定长度并包含一个或者多个域名标签的子字符串进行解码,解码为一个 Unicode 字符串。Decodes a substring of a specified length that contains one or more domain name labels, encoded according to the IDNA standard, to a string of Unicode characters.

MemberwiseClone()

创建当前 Object 的浅表副本。Creates a shallow copy of the current Object.

(继承自 Object)
ToString()

返回表示当前对象的字符串。Returns a string that represents the current object.

(继承自 Object)

适用于

线程安全性

的所有公共方法IdnMapping都是线程安全的, 并且可以从多个线程并发使用, 前提是IdnMapping该实例的属性不同时同时设置。All public methods of IdnMapping are thread-safe and may be used concurrently from multiple threads, as long as the IdnMapping instance's properties are not also set concurrently.

另请参阅