java.net.URI
ctor接受大多数非ASCII字符,但不接受ideographic space(0x3000)。 ctor以java.net.URISyntaxException: Illegal character in path ...
所以我的问题是:
URI
ctor不接受0x3000
但接受其他非ASCII字符?答案 0 :(得分:3)
JavaDoc documentation for java.net.URI
字符类别
RFC 2396精确指定了URI引用的各个组件中允许哪些字符。以下类别(大部分取自该规范)在下面用于描述这些约束:
- alpha US-ASCII字母字符,' A'通过' Z'和' a'通过' z'
- 数字 US-ASCII十进制数字符,' 0'通过' 9'
- alphanum 所有字母和数字字符 未保留所有的alphanum字符以及字符串中的字符" _-!。〜'()*"
- punct 字符串中的字符",;:$& + ="
- 保留所有符号字符和字符串中的字符"?/ [] @"
- 转义转义的八位字节,即由百分号('%')组成的三元组,后跟两个十六进制数字(' 0' - & #39; 9',' A' - ' F'和' a' - ' f')
- 其他不在US-ASCII字符集中的Unicode字符不是控制字符(根据
Character.isISOControl
方法),并且不是空格字符(根据Character.isSpaceChar
方法)(与RFC 2396的偏差,仅限于US-ASCII)所有合法URI字符集由未保留,保留,转义和其他字符组成。
特别是"其他" 不是否包含空格字符(由Character.isSpaceChar定义)为具有Unicode常规类别类型的空格字符
根据您在问题中链接的页面,表意空间字符确实是这些类型中的一种。
答案 1 :(得分:0)
请注意,第一个示例包含表意空间而不是常规空间。
问题是表意空间。
以下是允许使用非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
方法会处理这个问题。