Export (0) Print
Expand All

IdnMapping.GetAscii Method (String, Int32)

Encodes a substring of domain name labels that include Unicode characters outside the US-ASCII character range. 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.

Namespace:  System.Globalization
Assembly:  mscorlib (in mscorlib.dll)

'Declaration
Public Function GetAscii ( _
	unicode As String, _
	index As Integer _
) As String

Parameters

unicode
Type: System.String

The string to convert, which consists of one or more domain name labels delimited with label separators.

index
Type: System.Int32

A zero-based offset into unicode that specifies the start of the substring to convert. The conversion operation continues to the end of the unicode string.

Return Value

Type: System.String
The equivalent of the substring specified by the unicode and index parameters, consisting of displayable Unicode characters in the US-ASCII character range (U+0020 to U+007E) and formatted according to the IDNA standard.

ExceptionCondition
ArgumentNullException

unicode is Nothing.

ArgumentOutOfRangeException

index is less than zero.

-or-

index is greater than the length of unicode.

ArgumentException

unicode is invalid based on the AllowUnassigned and UseStd3AsciiRules properties, and the IDNA standard.

The unicode and index parameters define a substring with one or more labels that consist of valid Unicode characters. The labels are separated by label separators. The first character of the substring cannot begin with a label separator, but it can include and optionally end with a separator. The label separators are FULL STOP (period, U+002E), IDEOGRAPHIC FULL STOP (U+3002), FULLWIDTH FULL STOP (U+FF0E), and HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61). For example, the domain name "www.adatum.com" consists of the labels, "www", "adatum", and "com", separated by periods.

A label cannot contain any of the following characters:

The GetAscii method converts all label separators to FULL STOP (period, U+002E).

If unicode contains no characters outside the US-ASCII character range and no characters within the US-ASCII character range are prohibited, the method returns unicode unchanged.

Notes to Callers

In the .NET Framework 4.5, the IdnMapping class supports different versions of the IDNA standard, depending on the operating system in use:

See Unicode Technical Standard #46: IDNA Compatibility Processing for the differences in the way these standards handle particular sets of characters.

The following example removes the local part and the @ character from an email address, and passes the resulting domain name to the GetAscii(String, Int32) method to create a Punycode domain name, which is an encoded equivalent that consists of characters in the US-ASCII character range. The GetUnicode(String, Int32, Int32) method then converts the Punycode domain name back into the original domain name, but replaces the original label separators with the standard label separator.

Imports System.Globalization

Module Example
   Public Sub Main()
      Dim names() As String = { "johann_doe@bücher.com", "vi@мойдомен.рф", "ia@παράδειγμα.δοκιμή",
                                "webmaster@mycharity" + ChrW(&h3002) + "org",
                                "admin@prose" + ChrW(0) + "ware.com", "john_doe@proseware..com", 
                                "jane_doe@a.org", "me@my_company.com" }
      Dim idn As New IdnMapping()

      For Each name In names
         Try 
            Dim position As Integer = name.LastIndexOf("@")
            If position >= 0 Then name = name.Substring(position + 1)

            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

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1
Show:
© 2015 Microsoft