首页 > 解决方案 > Unicode 字符错误的 java.net.URI 非标准编码

问题描述

以下代码行:

    URI url = new URI("http://host?xyz=abc%u021B");

给出错误:

java.net.URISyntaxException:索引 19 处的格式错误的转义对: http://host?xyz=abc%u021B

原因是存在Unicode 字符%u021B非标准编码

有没有标准的方法来处理这个?

标签: javaunicodeurlencode

解决方案


有没有标准的方法来处理这个?

RFC 3986之后,这不是一个有效的 URI,正确的行为是拒绝它。

WHATWG 生活标准提出了一种更稳健的从字面上对待角色的行为:

否则,如果 byte 是 0x25 (%) 并且输入中 byte 之后的下两个字节不在 0x30 (0) 到 0x39 (9)、0x41 (A) 到 0x46 (F) 和 0x61 (a) 到 0x66 的范围内(f),包含所有内容,将字节附加到输出。

由于这不适用,因此%按原样添加并附加,这意味着:

%u021B

被视为相同:

%25u021B

%uxxxx编码方案在draft -duerst-iri中指定。如果你想实现它,伪代码将是:

  1. 匹配上%u([a-f0-9]{4})
  2. 将十六进制数字解析为字节数组b
  3. new String(b, UTF_16BE).getBytes(UTF_8)
  4. 将该结果中的每个字节附加为%xx
  5. 替换原来的%uxxxx匹配

推荐阅读