jTidy 8字符编解码问题:URL中%7BA3被转换为汉字
解决jTidy 8自动转义URL中%7BA3为汉字的问题
问题复现
输入包含%7BA3的HTML链接:
<a href="https://example.com/%7BA3" rel="nofollow noreferrer">https://example.com/%7BA3</a>
经jTidy 8处理后,%7BA3被错误转换为汉字“箣”(对应URL编码%E7%AE%A3),输出变为:
<a href="https://example.com/%E7%AE%A3" rel="nofollow noreferrer">https://example.com/箣</a>
解决方案
方案1:调整jTidy核心配置
尝试组合以下配置参数,禁用URL修复并保留原始实体编码:
Tidy tidy = new Tidy(); // 禁用URL自动修复 tidy.setFixUri(false); // 保留原始HTML实体 tidy.setPreserveEntities(true); // 启用原始输出模式,避免额外转义 tidy.setRawOut(true); // 指定输入输出编码为UTF-8,避免编码混乱 tidy.setInputEncoding("UTF-8"); tidy.setOutputEncoding("UTF-8"); // 执行解析处理 ByteArrayInputStream in = new ByteArrayInputStream(inputHtml.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream out = new ByteArrayOutputStream(); tidy.parse(in, out); String processedHtml = out.toString(StandardCharsets.UTF_8);
方案2:临时占位符绕过解析
如果配置调整无效,可通过占位符替换避开jTidy的URL解析逻辑:
- 处理前,将URL中的
%7B替换为一个不会被转义的临时字符串(如__LEFT_BRACE__) - 用jTidy处理HTML
- 处理后将占位符替换回
%7B
示例代码:
String inputHtml = "<a href=\"https://example.com/%7BA3\" rel=\"nofollow noreferrer\">https://example.com/%7BA3</a>"; // 替换href中的%7B为占位符 String tempHtml = inputHtml.replaceAll("href=\"([^\"]*)%7B", "href=\"$1__LEFT_BRACE__"); // jTidy处理(可配合方案1的配置) Tidy tidy = new Tidy(); tidy.setFixUri(false); ByteArrayInputStream in = new ByteArrayInputStream(tempHtml.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream out = new ByteArrayOutputStream(); tidy.parse(in, out); String processedHtml = out.toString(StandardCharsets.UTF_8); // 还原占位符为%7B String finalHtml = processedHtml.replaceAll("__LEFT_BRACE__", "%7B");
方案3:检查jTidy版本与配置项
确认使用的jTidy版本是否为最新稳定版,部分旧版本可能存在URL解析的bug。同时尝试设置以下配置项:
// 禁用URI自动转义 tidy.setConfigurationOption("uri-escaping", "false"); // 启用原始URL处理 tidy.setConfigurationOption("raw-url", "true");
内容的提问来源于stack exchange,提问作者Vishal Sharnagat
相关产品推荐
相关产品推荐

