You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)残留,出现“无法完全移除特殊字符”的现象。

另外,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:04:09