java - Unicode 字符错误的 java.net.URI 非标准编码
问题描述
以下代码行:
URI url = new URI("http://host?xyz=abc%u021B");
给出错误:
java.net.URISyntaxException:索引 19 处的格式错误的转义对: http://host?xyz=abc%u021B
原因是存在Unicode 字符%u021B
的非标准编码
有没有标准的方法来处理这个?
解决方案
有没有标准的方法来处理这个?
在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中指定。如果你想实现它,伪代码将是:
- 匹配上
%u([a-f0-9]{4})
- 将十六进制数字解析为字节数组
b
- 拿
new String(b, UTF_16BE).getBytes(UTF_8)
- 将该结果中的每个字节附加为
%xx
- 替换原来的
%uxxxx
匹配
推荐阅读
- c++ - 从仅 1 个子项目的 cmake 文件中获取“//usr/lib/x86_64-linux-gnu/libcrypto.so.1.1:添加符号时出错:命令行中缺少 DSO”
- c# - Nexmo C# whatsapp 集成
- php - For [PHP] 中的数组合并
- php - SQLSTATE 错误 23000 完整性和数据库冲突,更新或添加外键时出错
- matlab - Matlab角度函数来计算相位
- spring - 为什么 Spring Boot 失去了它的 Handler Mapping?
- javascript - 如何断言传递给类构造函数的函数是通过引用传递的,并且在使用组合时不重复?
- java - CDI 事件 fire() 创建新的观察者实例
- html - 将此渐变图像转换为 CSS 渐变
- android-studio - Kotlin 中的 Android:Google codelabs 项目中的数据绑定错误