如何在Jsoup中获取正确的Windows-1252编码以处理特殊字符Token?
解决Jsoup获取Windows-1252编码Token时特殊字符丢失的问题
核心问题在于Jsoup默认的字符集检测可能忽略了Windows-1252编码,导致0x9D这类特殊控制字符被错误解析或丢失。Chrome元素检查能正常处理是因为它自动将Windows-1252的控制字符映射为对应的Unicode可见字符,手动复制时已经完成这个映射,所以提交有效。以下是具体解决方案:
1. 先获取原始字节流再手动解码
绕过Jsoup的自动字符集检测,直接获取页面原始字节,用Windows-1252编码解码后再交给Jsoup解析:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class TokenFetcher { public static void main(String[] args) throws Exception { URL targetUrl = new URL("你的目标页面URL"); HttpURLConnection conn = (HttpURLConnection) targetUrl.openConnection(); conn.setRequestMethod("GET"); // 获取原始字节数据 InputStream inputStream = conn.getInputStream(); byte[] rawBytes = inputStream.readAllBytes(); inputStream.close(); // 用Windows-1252编码解码成字符串 String decodedHtml = new String(rawBytes, "Windows-1252"); // 解析处理后的HTML Document doc = Jsoup.parse(decodedHtml); // 提取Token String token = doc.select("input[name=你的Token参数名]").val(); } }
2. 强制Jsoup使用Windows-1252解析响应
如果要直接用Jsoup的连接方法,需显式指定解析字符集,避免自动检测出错:
import org.jsoup.Connection; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; public class TokenFetcher { public static void main(String[] args) throws Exception { Connection conn = Jsoup.connect("你的目标页面URL"); Connection.Response response = conn.execute(); // 强制用Windows-1252解析响应流 Document doc = Jsoup.parse(response.bodyStream(), "Windows-1252", response.url().toString()); String token = doc.select("input[name=你的Token参数名]").val(); } }
3. 验证Token的字符完整性
提取Token后,可以打印字符的十六进制值,确认0x9D对应的Unicode字符(U+201D)是否存在:
for (char c : token.toCharArray()) { System.out.printf("%04X ", (int) c); }
如果输出中包含201D,说明字符已正确保留,此时提交POST请求直接使用该Token即可。
内容的提问来源于stack exchange,提问作者GabrielH
相关产品推荐
相关产品推荐

