java.net.URI
ctor接受大多数非ASCII字符,但不接受ideographic space(0x3000)。 ctor在java.net.URISyntaxException: Illegal character in path ...
失败了
所以我的问题是:
URI
ctor不接受0x3000
但接受其他非ASCII字符?请注意,第一个示例包含表意空间而不是常规空间。
问题是表意空间。
以下是允许使用非ASCII字符的代码:
} else if ((c > 128)
&& !Character.isSpaceChar(c)
&& !Character.isISOControl(c)) {
// Allow unescaped but visible non-US-ASCII chars
return p + 1;
}
正如你所看到的,它不允许“时髦”的不可见角色。
另请参阅URI
类javadocs,它指定URI的每个组件中允许哪些字符(由类!)。
为什么?
这可能是一项安全措施。
别人不允许的是什么?
根据相应的Character
谓词方法,是一个空格或控制字符的字符。 (有关精确的规格,请参阅Character
javadocs。)
您还应注意,这是与URI规范的偏差。 URI规范表明,只有在以下情况下才允许使用非ASCII字符:
我的理解是,如果你有一个“离经叛道”的URI.toASCIIString()
对象,java.net.URI
方法将会处理这个问题。
JavaDoc documentation for java.net.URI
详细列出了可接受的字符集
人物类别
RFC 2396精确指定URI引用的各个组件中允许哪些字符。以下类别(大部分取自该规范)在下面用于描述这些约束:
- alpha US-ASCII字母字符,'A'到'Z'和'a'到'z'
- digit US-ASCII十进制数字符,'0'到'9'
- alphanum所有alpha和digit字符未保留所有alphanum字符以及字符串“_-!。〜'()*”中的字符
- punct字符串“,;:$&+ =”中的字符
- 保留所有punct字符以及字符串“?/ [] @”中的字符
- 转义转义八位字节,即由三角形组成的三元组,后跟两个十六进制数字('0' - '9','A' - 'F'和'a' - 'f')
- 其他不在US-ASCII字符集中的Unicode字符不是控制字符(根据
Character.isISOControl
方法),并且不是空格字符(根据Character.isSpaceChar
方法)(与RFC 2396的偏差,仅限于美国-ascii)所有合法URI字符集由未保留,保留,转义和其他字符组成。
特别是,“其他”不包括空格字符,它们(由Character.isSpaceChar)定义为具有Unicode常规类别类型的空格字符
根据您在问题中链接的页面,表意空间字符确实是这些类型中的一种。