Spring中从数据库读取Unicode字符异常问题排查
问题分析与解决
核心差异在于:你写死的test("<root>testωtest</root>")里的ω是实际Unicode字符,而从数据库读取的value中的ω大概率是字符串形式的Unicode转义序列(比如\u03C9),而非实际字符——这就是两次调用看似相同但结果不同的根源。
可能的原因
- 数据库存储时,未存入实际的
ω字符,而是存入了它的Unicode转义字符串\u03C9。 - JDBC连接或ORM框架(如MyBatis)读取数据时,未自动解析该转义序列,直接将其作为普通字符串返回。
解决步骤
- 验证数据库存储内容:直接查询数据库表,确认字段值显示的是
ω还是\u03C9。如果是后者,优先修正存储逻辑,确保存入实际字符而非转义序列。 - 手动解析Unicode转义序列:若无法修改存储逻辑,需在读取后手动将转义字符串转为实际字符。注意Java中
replaceAll的正则特性,直接用replaceAll("\\\\", "\\")无效,因为正则匹配单个反斜杠需要4个反斜杠,且无法直接解析\uXXXX格式。可以使用以下工具方法:
public static String parseUnicodeEscape(String str) { Pattern unicodePattern = Pattern.compile("\\\\u([0-9a-fA-F]{4})"); Matcher matcher = unicodePattern.matcher(str); StringBuffer result = new StringBuffer(); while (matcher.find()) { // 将十六进制字符串转为对应字符 char unicodeChar = (char) Integer.parseInt(matcher.group(1), 16); matcher.appendReplacement(result, String.valueOf(unicodeChar)); } matcher.appendTail(result); return result.toString(); }
调用方式:value = parseUnicodeEscape(value);之后再拼接XML。
3. 检查数据库连接字符集:确保JDBC URL配置了正确的字符集参数(以MySQL为例,添加useUnicode=true&characterEncoding=UTF-8),避免读取时字符编码异常导致转义。
内容的提问来源于stack exchange,提问作者Adam Jones
相关产品推荐
相关产品推荐

