URI中的非法字符

时间:2015-01-26 09:51:56

标签: java url encoding utf

java.net.URI ctor接受大多数非ASCII字符,但不接受ideographic space(0x3000)。 ctor以java.net.URISyntaxException: Illegal character in path ...

失败

所以我的问题是:

  • 为什么URI ctor不接受0x3000但接受其他非ASCII字符?
  • 其他哪些角色不接受?

2 个答案:

答案 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常规类别类型的空格字符

  • SPACE_SEPARATOR
  • LINE_SEPARATOR
  • PARAGRAPH_SEPARATOR

根据您在问题中链接的页面,表意空间字符确实是这些类型中的一种。

答案 1 :(得分:0)

  

请注意,第一个示例包含表意空间而不是常规空间。

问题是表意空间。

以下是允许使用非ASCII字符的代码:

        } else if ((c > 128)
                   && !Character.isSpaceChar(c)
                   && !Character.isISOControl(c)) {
            // Allow unescaped but visible non-US-ASCII chars
            return p + 1;
        }

正如你所看到的,它不允许“时髦”的不可见角色。

另请参阅URIjavadocs,它指定URI的每个组件中允许的字符数(由类!)。

  

为什么呢?

这可能是一种安全措施。

  

其他人不允许的是什么?

根据相应的Character谓词方法,是空格或控制字符的字符。 (有关精确的说明,请参阅Character javadocs。)

您还应该注意,这是与URI规范的偏差。 URI规范表明,只有在以下情况下才允许使用非ASCII字符:

  • 将UCS字符代码转换为UTF-8和
  • 百分比编码规范要求的UTF-8字节。

我的理解是,如果你有一个“离经叛道”URI.toASCIIString()对象,java.net.URI方法会处理这个问题。