IdnMapping 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
支持在 Internet 域名中使用非 ASCII 字符。 此类不能被继承。
public ref class IdnMapping sealedpublic sealed class IdnMappingtype IdnMapping = classPublic 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
注解
Internet 域名由一个或多个部分组成,称为域名标签,由标签分隔符分隔。 例如,域名“www.proseware.com”由标签“www”、“proseware”和“com”组成,并用句点分隔。 标准域名由 US-ASCII (或基本拉丁语) 字符范围(从 U+0021 到 U+007E)中的指定字符组成。 为了方便在不使用 US-ASCII 字符集的区域性中使用 Internet,2003 年采用了将应用程序中的域名国际化 (IDNA) 标准,以支持将 Unicode 字符包含在 US-ASCII 字符范围之外。 但是,名称服务器和域名解析继续依赖于 US-ASCII 字符范围内的字符。
IDNA 机制使用 Punycode 将包含 US-ASCII 字符范围之外的 Unicode 字符的国际化域名映射到域名系统支持的 US-ASCII 字符范围。 IDNA 机制仅用于转换域名,而不是通过 Internet 传输的数据。
重要
在 .NET Framework 4.5 中IdnMapping,类支持不同版本的 IDNA 标准,具体取决于使用的操作系统:
- 在 Windows 8 运行时,它支持 RFC 5891 概述的 2008 版 IDNA 标准:应用程序中的国际化域名 (IDNA) :协议。
- 在早期版本的 Windows 操作系统上运行时,它支持 RFC 3490 概述的 2003 版标准:将应用程序中的域名国际化 (IDNA) 。
有关这些标准处理特定字符集的方式的差异,请参阅 Unicode 技术标准 #46:IDNA 兼容性处理 。
方法 IdnMapping.GetAscii 规范化域名,将规范化名称转换为由 US-ASCII 代码点范围 (U+0020 到 U+007E) 的可显示的 Unicode 字符组成的表示形式,并在每个标签前面添加 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 实例的属性不是同时设置的。