Поделиться через


IdnMapping Класс

Определение

Поддерживает использование знаков, отличных от знаков 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 (или basic Latin) от U+0021 до U+007E. Для упрощения использования Интернета в языках и региональных параметрах, не использующих кодировку US-ASCII, в 2003 году был принят стандарт internationalizing domain names in Applications (IDNA) для поддержки включения символов Юникода за пределы диапазона символов US-ASCII. Однако серверы доменных имен и разрешение доменных имен по-прежнему используют символы в диапазоне символов US-ASCII.

Механизм IDNA использует Punycode для сопоставления международного доменного имени, содержащего символы Юникода за пределами диапазона символов US-ASCII, с диапазоном символов US-ASCII, поддерживаемым системой доменных имен. Механизм IDNA используется для преобразования только доменных имен, а не данных, передаваемых через Интернет.

Важно!

В платформа .NET Framework 4.5 IdnMapping класс поддерживает различные версии стандарта IDNA в зависимости от используемой операционной системы:

Различия в том, как эти стандарты обрабатывают определенные наборы символов, см. в разделе Технический стандарт Юникода #46: обработка совместимости IDNA .

Метод IdnMapping.GetAscii нормализует доменное имя, преобразует нормализованное имя в представление, состоящее из отображаемых символов Юникода в диапазоне кодовых точек US-ASCII (U+0020 в U+007E), и добавляет к каждой метке префикс совместимой с 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.

UseStd3AsciiRules

Получает или задает значение, указывающее, следует ли использовать стандартные или ослабленные правила именования в операциях, выполняемых членами текущего объекта IdnMapping.

Методы

Equals(Object)

Указывает, равны ли указанный объект и текущий объект IdnMapping.

GetAscii(String)

Кодирует строку меток доменных имен, в которой содержатся символы Юникода, в строку отображаемых символов Юникода в диапазоне символов US-ASCII. Строка форматируется в соответствии со стандартом IDNA.

GetAscii(String, Int32)

Кодирует подстроку меток имени домена, включающих знаки юникода, выходящие за диапазон символов US-ASCII. Подстрока преобразуется в строку отображаемых символов Юникода в диапазоне символов US-ASCII и форматируется в соответствии со стандартом IDNA.

GetAscii(String, Int32, Int32)

Кодирует указанное число символов в подстроке меток доменных имен, включающих символы Юникода за пределами диапазона символов US-ASCII. Подстрока преобразуется в строку отображаемых символов Юникода в диапазоне символов US-ASCII и форматируется в соответствии со стандартом IDNA.

GetHashCode()

Возвращает хэш-код объекта IdnMapping.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
GetUnicode(String)

Декодирует строку, состоящую из одной или нескольких меток доменного имени, в соответствии со стандартом IDNA в строку символов Юникода.

GetUnicode(String, Int32)

Декодирует подстроку, состоящую из одной или нескольких меток доменного имени, в соответствии со стандартом IDNA в строку символов Юникода.

GetUnicode(String, Int32, Int32)

Декодирует подстроку заданной длины, состоящую из одной или нескольких меток доменного имени, в соответствии со стандартом IDNA в строку символов Юникода.

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

Потокобезопасность

Все открытые IdnMapping методы являются потокобезопасными и могут использоваться одновременно из нескольких потоков, если IdnMapping свойства экземпляра также не заданы одновременно.

См. также раздел