Java中如何移除特定Unicode字符(保留é等可打印字符)
解决方案:移除XML非法字符同时保留é等非ASCII可打印字符
问题根源
XML 1.0规范仅允许特定范围的字符:#x9(制表符)、#xA(换行)、#xD(回车),以及#x20-#xD7FF、#xE000-#xFFFD、#x10000-#x10FFFF区间的字符。\u0019(End Of Medium)属于非法控制字符,而é(U+00E9)落在合法区间内。之前使用\\P{Print}会误删é,因为\P{Print}仅覆盖ASCII可打印字符(0x20-0x7E),不包含非ASCII的打印字符;StringEscapeUtils.unescapeJava是处理Java转义字符的工具,并不适用于移除XML非法字符。
可行方案
方案1:精准移除目标非法字符
如果确认只有\u0019这一个问题字符,直接针对性替换最高效,完全不会影响其他字符:
public String removeEOMChar(String input) { if (input == null) return null; return input.replace("\u0019", ""); }
方案2:批量移除所有XML非法字符
如果可能存在其他类似的非法控制字符,用正则匹配XML规范外的字符并移除,同时保留所有合法字符(包括é这类非ASCII字符):
public String sanitizeXmlString(String input) { if (input == null) return null; // 匹配所有XML 1.0不允许的字符 String invalidXmlCharsRegex = "[^\\x09\\x0A\\x0D\\x20-\\xD7FF\\xE000-\\xFFFD\\x10000-\\x10FFFF]"; return input.replaceAll(invalidXmlCharsRegex, ""); }
验证示例
输入字符串:L'Oréal\u0019Test
- 方案1处理后:
L'OréalTest - 方案2处理后:
L'OréalTest
两种方案都不会删除é,同时解决了XML解析报错的问题。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

