Module java.base
Package java.net

Class IDN

java.lang.Object
java.net.IDN

public final class IDN extends Object
提供了在普通Unicode表示和ASCII兼容编码(ACE)表示之间转换国际化域名(IDNs)的方法。国际化域名可以使用整个Unicode范围的字符,而传统域名仅限于ASCII字符。ACE是Unicode字符串的编码,仅使用ASCII字符,并可与仅理解传统域名的软件(如域名系统)一起使用。

国际化域名在RFC 3490中定义。RFC 3490定义了两个操作:ToASCII和ToUnicode。这两个操作使用Nameprep算法,这是Stringprep的一个配置文件,以及Punycode算法来回转换域名字符串。

上述转换过程的行为可以通过各种标志进行调整:

  • 如果使用ALLOW_UNASSIGNED标志,则要转换的域名字符串可以包含Unicode 3.2中未分配的代码点,这是IDN转换所基于的Unicode版本。如果未使用该标志,则将未分配的代码点视为错误。
  • 如果使用USE_STD3_ASCII_RULES标志,则会根据RFC 1122RFC 1123检查ASCII字符串。如果它们不符合要求,则会报错。
这些标志可以逻辑OR在一起。

在国际化域名支持方面,安全性考虑是重要的。例如,英文域名可能会被同形异义 - 通过替换非拉丁字母而恶意拼写。 Unicode技术报告#36讨论了IDN支持的安全问题以及可能的解决方案。应用程序在使用国际域名时负责采取足够的安全措施。

自版本:
1.6
外部规范
  • Field Details

    • ALLOW_UNASSIGNED

      public static final int ALLOW_UNASSIGNED
      用于允许处理未分配的代码点的标志
      参见:
    • USE_STD3_ASCII_RULES

      public static final int USE_STD3_ASCII_RULES
      用于打开针对STD-3 ASCII规则的检查的标志
      参见:
  • Method Details

    • toASCII

      public static String toASCII(String input, int flag)
      将字符串从Unicode转换为ASCII兼容编码(ACE),如RFC 3490中的ToASCII操作所定义。

      ToASCII操作可能失败。如果ToASCII的任何步骤失败,则ToASCII操作失败。如果ToASCII操作失败,将抛出IllegalArgumentException异常。在这种情况下,输入字符串不应在国际化域名中使用。

      标签是域名的单个部分。原始的ToASCII操作,如RFC 3490中定义的,仅对单个标签进行操作。此方法可以处理标签和整个域名,假定域名中的标签始终由点分隔。以下字符被识别为点:\u002E(句号)、\u3002(表意句号)、\uFF0E(全角句号)和\uFF61(半角表意句号)。如果点用作标签分隔符,此方法还会将所有点更改为输出转换后的字符串中的\u002E(句号)。

      参数:
      input - 要处理的字符串
      flag - 处理标志;可以是0或可能标志的任何逻辑OR
      返回:
      转换后的String
      抛出:
      IllegalArgumentException - 如果输入字符串不符合RFC 3490规范
      外部规范
    • toASCII

      public static String toASCII(String input)
      将字符串从Unicode转换为ASCII兼容编码(ACE),如RFC 3490中的ToASCII操作所定义。

      此便利方法的工作方式类似于调用两个参数的对应方法:

      toASCII(input, 0);
      参数:
      input - 要处理的字符串
      返回:
      转换后的String
      抛出:
      IllegalArgumentException - 如果输入字符串不符合RFC 3490规范
      外部规范
    • toUnicode

      public static String toUnicode(String input, int flag)
      将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。

      ToUnicode永远不会失败。在任何错误情况下,将返回未修改的输入字符串。

      标签是域名的单个部分。原始的ToUnicode操作,如RFC 3490中定义的,仅对单个标签进行操作。此方法可以处理标签和整个域名,假定域名中的标签始终由点分隔。以下字符被识别为点:\u002E(句号)、\u3002(表意句号)、\uFF0E(全角句号)和\uFF61(半角表意句号)。

      参数:
      input - 要处理的字符串
      flag - 处理标志;可以是0或可能标志的任何逻辑OR
      返回:
      转换后的String
      外部规范
    • toUnicode

      public static String toUnicode(String input)
      将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。

      此便利方法的工作方式类似于调用两个参数的对应方法:

      toUnicode(input, 0);
      参数:
      input - 要处理的字符串
      返回:
      转换后的String
      外部规范