国际化域名在RFC 3490中定义。RFC 3490定义了两个操作:ToASCII和ToUnicode。这两个操作使用Nameprep算法,这是Stringprep的一个配置文件,以及Punycode算法来回转换域名字符串。
上述转换过程的行为可以通过各种标志进行调整:
- 如果使用ALLOW_UNASSIGNED标志,则要转换的域名字符串可以包含Unicode 3.2中未分配的代码点,这是IDN转换所基于的Unicode版本。如果未使用该标志,则将未分配的代码点视为错误。
- 如果使用USE_STD3_ASCII_RULES标志,则会根据RFC 1122和RFC 1123检查ASCII字符串。如果它们不符合要求,则会报错。
在国际化域名支持方面,安全性考虑是重要的。例如,英文域名可能会被同形异义 - 通过替换非拉丁字母而恶意拼写。 Unicode技术报告#36讨论了IDN支持的安全问题以及可能的解决方案。应用程序在使用国际域名时负责采取足够的安全措施。
- 自版本:
- 1.6
- 外部规范
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
用于允许处理未分配的代码点的标志static final int
用于打开针对STD-3 ASCII规则的检查的标志 -
Method Summary
Modifier and TypeMethodDescriptionstatic String
将字符串从Unicode转换为ASCII兼容编码(ACE),如RFC 3490中的ToASCII操作所定义。static String
将字符串从Unicode转换为ASCII兼容编码(ACE),如RFC 3490中的ToASCII操作所定义。static String
将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。static String
将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。
-
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
将字符串从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
- 参数:
-
input
- 要处理的字符串 - 返回:
-
转换后的
String
- 抛出:
-
IllegalArgumentException
- 如果输入字符串不符合RFC 3490规范 - 外部规范
-
toUnicode
将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。ToUnicode永远不会失败。在任何错误情况下,将返回未修改的输入字符串。
标签是域名的单个部分。原始的ToUnicode操作,如RFC 3490中定义的,仅对单个标签进行操作。此方法可以处理标签和整个域名,假定域名中的标签始终由点分隔。以下字符被识别为点:\u002E(句号)、\u3002(表意句号)、\uFF0E(全角句号)和\uFF61(半角表意句号)。
- 参数:
-
input
- 要处理的字符串 -
flag
- 处理标志;可以是0或可能标志的任何逻辑OR - 返回:
-
转换后的
String
- 外部规范
-
toUnicode
将字符串从ASCII兼容编码(ACE)转换为Unicode,如RFC 3490中的ToUnicode操作所定义。此便利方法的工作方式类似于调用两个参数的对应方法:
toUnicode
(input, 0);- 参数:
-
input
- 要处理的字符串 - 返回:
-
转换后的
String
- 外部规范
-