java.net.URI - :索引XXX处片段中的非法字符 - 由于字符“#”

时间:2014-01-06 02:24:21

标签: java url

源代码如下:(a-zA-Z全部替换为x)

String url = "xxxxx://xx730xxxxxxx005.xxxx.xxx:8443/xxx/xxxxxxxxx.xxxx#xxxxxx=xxxxxxx2&&xxxxxxxxx=1388782204000&&xxxxxxx=1388785804000&&xxxxx=xxxxxxxxxxx='xxx-xx730xxxxx10'%20xxx%20xxxxxxxx='__xxx__xxx_xxx_xxxxxxx_xxxx_xxxxxxxxx_#2_xxx-xx__xxx_xxx_xxxxxxx_______xxxx'"

System.out.println(url2.charAt(215)); -> result #
URI.create(url2); // illegal character exception

我不明白为什么如果它是一个有效的URL字符,我会在索引215处获取“#”中的非法字符。

1 个答案:

答案 0 :(得分:2)

URI specification

  

URI的片段标识符组件允许间接
  通过引用主要来识别次要资源   资源和其他识别信息。 [...] 一个片段   标识符组件由数字符号的存在表示   (“#”)字符,以URI结尾终止。

格式为

fragment    = *( pchar / "/" / "?" )

其中pchar

pchar       = unreserved / pct-encoded / sub-delims / ":" / "@"

其中unreservedpct-encodedsub-delims

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

换句话说,#在第一个#之后不是有效字符,表示片段的开头。它需要编码。使用%23