如何处理URL中的对象替换字符()?
处理URL中的对象替换字符(U+FFFC)问题
问题背景
用Jsoup爬取URL时遇到包含对象替换字符(\uFFFC)的链接,执行URLDecoder.decode(url, "UTF-8")解码后该字符仍存在;直接在代码中写入该字符并打印会触发编译错误;解码后的URL与预期内容不匹配(预期是带?的路径)。
示例URL编码形式:https://www.breightgroup.com/job/hse-advisor-embedded-contract-roles%ef%bf%bc/
解决方案
1. 直接替换对象替换字符
该字符的Unicode编码是\uFFFC,解码后可直接替换为预期的?,或是直接移除:
String url = URLDecoder.decode("https://www.breightgroup.com/job/hse-advisor-embedded-contract-roles%ef%bf%bc/", "UTF-8"); // 替换为预期的? String correctedUrl = url.replace('\uFFFC', '?'); // 或者直接移除该字符 // String correctedUrl = url.replace(String.valueOf('\uFFFC'), ""); if(correctedUrl.contains("https://www.breightgroup.com/job/hse-advisor-embedded-contract-roles?/")){ System.out.println("The same"); }else { System.out.println("Not the same"); }
2. 过滤所有非打印/控制字符
如果URL中可能存在其他类似异常字符,可通过正则过滤掉所有非可打印的Unicode字符:
String url = URLDecoder.decode("https://www.breightgroup.com/job/hse-advisor-embedded-contract-roles%ef%bf%bc/", "UTF-8"); // 过滤非打印字符,将其替换为? String cleanedUrl = url.replaceAll("[^\\p{Print}]", "?"); System.out.println(cleanedUrl); // 此时判断会匹配预期内容
3. 避免直接写入异常字符
不要在代码中直接粘贴这个字符,改用Unicode转义序列\uFFFC引用,即可避免编译错误:
// 正确引用该字符的方式 System.out.println("\uFFFC");
说明
对象替换字符(U+FFFC)通常是文档转纯文本时标记嵌入对象的占位符,URL中出现它大概率是编码错误或源网站文本转换问题。根据预期需求,替换为?或直接移除是最直接的解决方式。
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

