Spring Boot项目replace(' ',' ')在Tomcat失效但Jar运行正常
问题原因及解决方案
核心原因:字符编码依赖平台默认值,本地与Tomcat服务器环境不一致
你的代码中Scanner和FileWriter都未指定明确字符编码,完全依赖运行环境的默认编码:
- 本地运行Jar时,系统默认编码大概率是UTF-8,读取UTF-8编码的文件时,U+00A0(不换行空格NBSP)会被正确解析为单个字符,
replace(' ',' ')能匹配并替换。 - 部署到Tomcat 9后,服务器的JVM默认编码可能不是UTF-8(比如ISO-8859-1、GBK等):
- 若文件是UTF-8编码,用非UTF-8编码读取时,U+00A0的UTF-8字节序列
C2 A0会被拆分为两个独立字符:Ã(U+00C2)和(U+00A0)。 - 你的代码只替换了
,导致Ã(即你看到的xC2)残留,出现“无法完全移除特殊字符”的现象。
- 若文件是UTF-8编码,用非UTF-8编码读取时,U+00A0的UTF-8字节序列
另外,Tomcat自身的编码配置(如file.encoding系统属性)也可能影响JVM的默认编码,进一步加剧这个差异。
解决方案
1. 代码中强制指定UTF-8编码(最可靠)
修改读取和写入逻辑,明确指定编码,摆脱对平台默认值的依赖:
import java.nio.charset.StandardCharsets; import java.nio.file.Files; // 读取时指定UTF-8 try(Scanner scanner = new Scanner(is, StandardCharsets.UTF_8); // 用Files.newBufferedWriter替代FileWriter,强制指定UTF-8编码 BufferedWriter writer = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) { String line; while(scanner.hasNextLine()){ line = scanner.nextLine(); writer.append(line.replace("<br>","") .replace(' ',' ') .replace("> ",">") ); writer.newLine(); } }
2. 统一Tomcat的JVM默认编码
在Tomcat的启动脚本(如catalina.sh或catalina.bat)中添加JVM参数,强制设置文件编码为UTF-8:
- Linux/macOS:在
CATALINA_OPTS中添加-Dfile.encoding=UTF-8 - Windows:在
CATALINA_OPTS中添加-Dfile.encoding=UTF-8
3. 扩展替换逻辑,覆盖所有空白字符
如果需要处理多种非标准空格(包括NBSP),可以用正则表达式替换所有Unicode空白字符:
line = line.replace("<br>","") .replaceAll("\\p{Zs}", " ") // 替换所有Unicode空格分隔符(含NBSP) .replace("> ",">");
内容的提问来源于stack exchange,提问作者Jack Boch
相关产品推荐
相关产品推荐

