如何修复Spring Boot与Angular应用中£符号前出现的Â编码异常问题
修复UTF-8文件读取导致的£乱码问题
我来帮你拆解这个问题——核心问题出在读取文件时的编码不匹配,和写入环节、数据库本身关系不大。
问题根源分析
你写入文件时的操作是正确的:用Java 11的FileWriter显式指定了StandardCharsets.UTF_8编码,所以文件本身是标准的UTF-8格式,记事本能正常显示就是证明。
但读取环节踩了FileReader的坑:这个类在Java 8(甚至直到Java 11)都没有提供指定编码的构造函数,它默认会使用系统平台的默认字符编码(比如Windows上可能是GBK,Linux上可能是ISO-8859-1)。当UTF-8编码的£(二进制为0xC2 0xA3)被非UTF-8编码读取时,会被拆成两个独立字符:Â(对应0xC2)和£(对应0xA3),这就是你看到£100的原因。
修复方案
把FileReader换成InputStreamReader并显式指定UTF-8编码,确保读写编码一致。修改后的读取代码如下:
// Java 8 正确的读取方式 try (InputStreamReader reader = new InputStreamReader(new FileInputStream(queFile), StandardCharsets.UTF_8)) { List<QuackDTO> qDTOs = objectMapper.readValue(reader, new TypeReference<List<QuackDTO>>(){}); }
补充说明
- 你提到的
Files.readString(path, StandardCharsets.UTF_8)能正常工作,本质也是因为它显式指定了UTF-8编码,避开了系统默认编码的坑。 - 数据库环节没问题:你的MySQL用了utf8mb4字符集,乱码在读取到DTO时已经出现,和数据库无关。
- 建议养成习惯:只要处理包含非ASCII字符的文件读写,都要显式指定编码,不要依赖系统默认编码,避免跨环境或跨平台的乱码问题。
内容的提问来源于stack exchange,提问作者user14734781
相关产品推荐
相关产品推荐

