JSoup获取URL编码异常:如何修正ñ的编码错误?
解决JSoup访问URL时的编码不匹配问题
我来帮你搞定这个编码难题!你遇到的核心问题是Unicode字符的两种表示形式导致的URL编码差异,具体来说:
问题原因拆解
- 你要编码的
ñ有两种Unicode编码方式:- 合成形式:单个字符U+00F1,UTF-8编码是
C3 91,对应URL编码就是%C3%91——这也是URLEncoder默认输出的结果,但服务器不买账。 - 分解形式:字母
n(U+006E)加上组合波浪号(U+0303),两个字符的UTF-8编码分别是6E和CC 83,对应URL编码就是n%CC%83,也就是服务器期望的CIGUEN%CC%83AL.JPG格式。
- 合成形式:单个字符U+00F1,UTF-8编码是
服务器的文件系统/路由是基于分解形式的字符存储文件名的,所以直接用URLEncoder编码合成形式的字符,自然会出现异常。
修复方案代码实现
我们需要先把字符串转换为分解形式,再进行URL编码,具体代码如下:
private static void GetUrl() { try { String urlBase = "http://betatruebaonline.com/img/parte/330/"; String fileName = "CIGUEÑAL.JPG"; // 第一步:将字符串转换为Unicode分解形式(NFD) String normalizedFileName = Normalizer.normalize(fileName, Normalizer.Form.NFD); // 第二步:UTF-8编码,指定编码格式避免平台差异 String encodedFileName = URLEncoder.encode(normalizedFileName, "UTF-8"); // 可选但规范的步骤:把URLEncoder默认生成的+替换为URL标准的%20 encodedFileName = encodedFileName.replace("+", "%20"); // 拼接得到正确的URL String fullUrl = urlBase + encodedFileName; System.out.println(fullUrl); // 输出:http://betatruebaonline.com/img/parte/330/CIGUEN%CC%83AL.JPG // 接下来就可以用JSoup正常访问了 // Document document = Jsoup.connect(fullUrl).get(); } catch (UnsupportedEncodingException | Normalizer.FormNotFoundException e) { e.printStackTrace(); } }
关键细节说明
Normalizer.normalize方法:Java提供的标准化Unicode字符的工具,Normalizer.Form.NFD就是将合成字符分解为基础字符+组合标记的形式。- 必须指定
URLEncoder.encode的编码为UTF-8:避免不同平台默认编码不一致导致的问题。 - 替换
+为%20:因为URLEncoder会把空格编码为+,但URL标准中应该用%20,虽然你的文件名没有空格,但加上这个步骤让代码更健壮。
内容的提问来源于stack exchange,提问作者ppk
相关产品推荐
相关产品推荐

