IdnMapping Classe

Definição

Dá suporte ao uso de caracteres não ASCII para nomes de domínio da Internet. Essa classe não pode ser herdada.

public ref class IdnMapping sealed
public sealed class IdnMapping
type IdnMapping = class
Public NotInheritable Class IdnMapping
Herança
IdnMapping

Exemplos

O exemplo a seguir usa o GetAscii(String, Int32, Int32) método para converter uma matriz de nomes de domínio internacionalizados em Punycode. Em GetUnicode seguida, o método converte o nome de domínio punycode de volta para o nome de domínio original, mas substitui os separadores de rótulo originais pelo separador de rótulo padrão.

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

Comentários

Um nome de domínio da Internet consiste em uma ou mais partes, chamadas rótulos de nome de domínio, separadas por separadores de rótulo. Por exemplo, o nome de domínio "www.proseware.com" consiste nos rótulos, "www", "proseware" e "com", separados por períodos. Os nomes de domínio padrão consistem em caracteres designados no intervalo de caracteres US-ASCII (ou Latino Básico), de U+0021 a U+007E. Para facilitar o uso da Internet em culturas que não usam o conjunto de caracteres US-ASCII, o padrão IDNA (Internationalizing Domain Names in Applications) foi adotado em 2003 para dar suporte à inclusão de caracteres Unicode fora do intervalo de caracteres US-ASCII. No entanto, os servidores de nomes e a resolução de nomes de domínio continuam a depender de caracteres dentro do intervalo de caracteres US-ASCII.

O mecanismo IDNA usa Punycode para mapear um nome de domínio internacionalizado que contém caracteres Unicode fora do intervalo de caracteres US-ASCII para o intervalo de caracteres US-ASCII compatível com o sistema de nomes de domínio. O mecanismo IDNA é usado para converter apenas nomes de domínio, não dados transmitidos pela Internet.

Importante

No .NET Framework 4.5, a IdnMapping classe dá suporte a diferentes versões do padrão IDNA, dependendo do sistema operacional em uso:

Consulte Unicode Technical Standard #46: Processamento de compatibilidade IDNA para obter as diferenças na maneira como esses padrões lidam com conjuntos específicos de caracteres.

O IdnMapping.GetAscii método normaliza um nome de domínio, converte o nome normalizado em uma representação que consiste em caracteres Unicode exibiveis no intervalo de pontos de código US-ASCII (U+0020 em U+007E) e acrescenta um prefixo ACE (codificação compatível com ASCII) ("xn--") para cada rótulo. O IdnMapping.GetUnicode método restaura os rótulos de nome de domínio convertidos pelo GetAscii método.

Se a cadeia de caracteres a ser convertida incluir os caracteres separadores de rótulo IDEOGRAPHIC FULL STOP (U+3002), FULLWIDTH FULL STOP (U+FF0E) e HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61), o método os GetAscii converterá no separador de rótulo FULL STOP (período, U+002E). O GetUnicode método, no entanto, não restaura o caractere separador de rótulo original.

Construtores

Nome Description
IdnMapping()

Inicializa uma nova instância da classe IdnMapping.

Propriedades

Nome Description
AllowUnassigned

Obtém ou define um valor que indica se pontos de código Unicode não atribuídos são usados em operações executadas por membros do objeto atual IdnMapping .

UseStd3AsciiRules

Obtém ou define um valor que indica se as convenções de nomenclatura padrão ou descontraídas são usadas em operações executadas por membros do objeto atual IdnMapping .

Métodos

Nome Description
Equals(Object)

Indica se um objeto especificado e o objeto atual IdnMapping são iguais.

GetAscii(String, Int32, Int32)

Codifica o número especificado de caracteres em uma subcadeia de caracteres de rótulos de nome de domínio que incluem caracteres Unicode fora do intervalo de caracteres US-ASCII. A subcadeia de caracteres é convertida em uma cadeia de caracteres Unicode exibivel no intervalo de caracteres US-ASCII e é formatada de acordo com o padrão IDNA.

GetAscii(String, Int32)

Codifica uma subcadeia de caracteres de rótulos de nome de domínio que incluem caracteres Unicode fora do intervalo de caracteres US-ASCII. A subcadeia de caracteres é convertida em uma cadeia de caracteres Unicode exibivel no intervalo de caracteres US-ASCII e é formatada de acordo com o padrão IDNA.

GetAscii(String)

Codifica uma cadeia de caracteres de rótulos de nome de domínio que consistem em caracteres Unicode em uma cadeia de caracteres Unicode exibivel no intervalo de caracteres US-ASCII. A cadeia de caracteres é formatada de acordo com o padrão IDNA.

GetHashCode()

Retorna um código hash para este IdnMapping objeto.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
GetUnicode(String, Int32, Int32)

Decodifica uma subcadeia de caracteres de um comprimento especificado que contém um ou mais rótulos de nome de domínio, codificados de acordo com o padrão IDNA, para uma cadeia de caracteres Unicode.

GetUnicode(String, Int32)

Decodifica uma subcadeia de caracteres de um ou mais rótulos de nome de domínio, codificados de acordo com o padrão IDNA, para uma cadeia de caracteres Unicode.

GetUnicode(String)

Decodifica uma cadeia de caracteres de um ou mais rótulos de nome de domínio, codificados de acordo com o padrão IDNA, para uma cadeia de caracteres Unicode.

MemberwiseClone()

Cria uma cópia superficial do Objectatual.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)
TryGetAscii(ReadOnlySpan<Char>, Span<Char>, Int32)

Dá suporte ao uso de caracteres não ASCII para nomes de domínio da Internet. Essa classe não pode ser herdada.

TryGetUnicode(ReadOnlySpan<Char>, Span<Char>, Int32)

Dá suporte ao uso de caracteres não ASCII para nomes de domínio da Internet. Essa classe não pode ser herdada.

Aplica-se a

Acesso thread-safe

Todos os métodos públicos são IdnMapping thread-safe e podem ser usados simultaneamente de vários threads, desde que as IdnMapping propriedades da instância também não sejam definidas simultaneamente.

Confira também