IdnMapping Class

Note: This class is new in the .NET Framework version 2.0.

Supports the use of non-ASCII characters for Internet domain names. This class cannot be inherited.

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

public sealed class IdnMapping
public final class IdnMapping
public final class IdnMapping

An Internet domain name consists of one or more parts, called domain name labels, separated by label separators. For example, the domain name "" consists of the labels, "www", "microsoft", and "com" separated by periods.

The Internationalizing Domain Names in Applications (IDNA) mechanism maps an internationalized domain name that contains Unicode characters outside the US-ASCII character range to an IDNA domain name that consists of Unicode characters solely in the displayable US-ASCII character range. The IDNA mechanism is used to convert only domain names, not data transmitted over the Internet.

The IdnMapping class embodies and extends the IDNA mechanism. The 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 prefix ("xn--") to each label.

The label separator characters IDEOGRAPHIC FULL STOP (U+3002), FULLWIDTH FULL STOP (U+FF0E), and HALFWIDTH IDEOGRAPHIC FULL STOP (U+FF61) are converted to the label separator FULL STOP (that is, period; U+002E).

For more information, see the RFC 3490 standard, "Internationalizing Domain Names in Applications," at Request for Comments (RFC).

The following code example uses the GetAscii(String,Int32,Int32) method to convert a domain name to a domain name that complies with the IDNA standard. The GetUnicode(String,Int32,Int32) method then converts the standardized domain name back into the original domain name, except that the original label separators are replaced with the standard label separator.

// This example demonstrates the GetAscii and GetUnicode methods.
// For sake of illustration, this example uses the most complex
// form of those methods, not the most convenient.

using System;
using System.Globalization;

class Sample 
    public static void Main() 
   Define a domain name consisting of the labels: GREEK SMALL LETTER 
   THETA (U+03B8); FULLWIDTH FULL STOP (U+FF0E); and "com".
    string name = "\u03C0\u3002\u03B8\uFF0Ecom";
    string international;
    string nonInternational;

    string msg1 = "the original non-internationalized \ndomain name:";
    string msg2 = "Allow unassigned characters?:     {0}";
    string msg3 = "Use non-internationalized rules?: {0}";
    string msg4 = "Convert the non-internationalized domain name to international format...";
    string msg5 = "Display the encoded domain name:\n\"{0}\"";
    string msg6 = "the encoded domain name:";
    string msg7 = "Convert the internationalized domain name to non-international format...";
    string msg8 = "the reconstituted non-internationalized \ndomain name:";
    string msg9 = "Visually compare the code points of the reconstituted string to the " +
                  "original.\n" +
                  "Note that the reconstituted string contains standard label " +
                  "separators (U+002e).";
// ----------------------------------------------------------------------------
    CodePoints(name, msg1);
// ----------------------------------------------------------------------------

    IdnMapping idn = new IdnMapping();

    Console.WriteLine(msg2, idn.AllowUnassigned);
    Console.WriteLine(msg3, idn.UseStd3AsciiRules);
// ----------------------------------------------------------------------------
    international = idn.GetAscii(name, 0, name.Length);
    Console.WriteLine(msg5, international);
    CodePoints(international, msg6);
// ----------------------------------------------------------------------------
    nonInternational = idn.GetUnicode(international, 0, international.Length);
    CodePoints(nonInternational, msg8);
// ----------------------------------------------------------------------------
    static void CodePoints(string value, string title)
    Console.WriteLine("Display the Unicode code points of {0}", title);
    foreach (char c in value) 
        Console.Write("{0:x4} ", Convert.ToInt32(c));
This code example produces the following results:

Display the Unicode code points of the original non-internationalized
domain name:
03c0 3002 03b8 ff0e 0063 006f 006d

Allow unassigned characters?:     False
Use non-internationalized rules?: False

Convert the non-internationalized domain name to international format...
Display the encoded domain name:

Display the Unicode code points of the encoded domain name:
0078 006e 002d 002d 0031 0078 0061 002e 0078 006e 002d 002d 0074 0078 0061 002e 0063 006f

Convert the internationalized domain name to non-international format...
Display the Unicode code points of the reconstituted non-internationalized
domain name:
03c0 002e 03b8 002e 0063 006f 006d

Visually compare the code points of the reconstituted string to the original.
Note that the reconstituted string contains standard label separators (U+002e).



Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

.NET Framework

Supported in: 2.0