URI中的非法字符

问题描述 投票:0回答:2

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

所以我的问题是:

  • 为什么URI ctor不接受0x3000但接受其他非ASCII字符?
  • 还有哪些其他角色不接受?
java url encoding utf
2个回答
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方法将会处理这个问题。


3
投票

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

  • SPACE_SEPARATOR
  • LINE_SEPARATOR
  • PARAGRAPH SEPARATOR

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

© www.soinside.com 2019 - 2024. All rights reserved.