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

在Ubuntu虚拟机中Java解码字节为UTF-8及编码异常问题求助

在Ubuntu虚拟机Java中解决UTF-8字节解码与JavaMail乱码问题

看起来你遇到了典型的JVM默认编码不一致导致的乱码问题——本地桌面环境默认编码是UTF-8,但Ubuntu虚拟机的系统或Tomcat JVM用了其他编码(比如ISO-8859-1),导致解码时特殊字符(像ó)被替换成了?。下面分几个层面解决你的问题:

一、全局配置Tomcat的JVM编码(解决核心问题)

单独给jar包加-Dfile.encoding=UTF-8只能解决单个进程的编码,但Tomcat作为容器,需要在全局启动参数里配置,让整个JVM进程都用UTF-8处理字符:

  • 找到Tomcat的配置文件,不同版本路径可能不同:
    • 系统级安装的Tomcat 9通常在/etc/tomcat9/tomcat.conf
    • 手动安装的Tomcat可以找bin/catalina.sh(Linux)
  • 在文件中添加或修改JAVA_OPTS行,同时指定两个关键编码参数:
    JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
    
    其中-Dsun.jnu.encoding是处理文件名和系统路径编码的,刚好对应你创建含ó字符文件的场景,避免文件读取时乱码。
  • 重启Tomcat服务生效:
    sudo systemctl restart tomcat9
    

二、代码层面强制显式指定UTF-8解码

永远不要依赖系统默认编码来解码字节,在所有字节转字符串的操作中显式指定UTF-8,从源头避免乱码:

// 错误写法:依赖JVM默认编码,容易出问题
String content = new String(fileBytes);

// 正确写法:显式用UTF-8解码
import java.nio.charset.StandardCharsets;
String content = new String(fileBytes, StandardCharsets.UTF_8);

如果是读取文件内容,也要指定编码:

// 用NIO方式读取(推荐)
import java.nio.file.Files;
import java.nio.file.Paths;
String fileContent = Files.readString(Paths.get("your-file.txt"), StandardCharsets.UTF_8);

// 或者用传统BufferedReader
try (BufferedReader reader = new BufferedReader(
         new InputStreamReader(new FileInputStream("your-file.txt"), StandardCharsets.UTF_8))) {
    String line;
    while ((line = reader.readLine()) != null) {
        // 处理每行内容
    }
}

三、JavaMail发送邮件的编码细节

JavaMail发送邮件时,不仅要确保内容解码正确,还要在邮件对象里显式指定UTF-8编码,避免邮件传输过程中乱码:

import javax.mail.internet.MimeMessage;

// 创建邮件对象后,设置内容和编码
MimeMessage message = new MimeMessage(session);
// HTML格式邮件指定编码
message.setContent("邮件内容包含ó这类特殊字符", "text/html; charset=UTF-8");
// 邮件主题单独指定编码(避免主题乱码)
message.setSubject("邮件主题含ó", "UTF-8");
// 如果是纯文本邮件,用setText方法指定编码
message.setText("纯文本内容含ó", "UTF-8");

四、验证编码是否生效

可以在你的Tomcat应用里加一段调试代码,打印当前JVM的编码参数,确认配置是否生效:

System.out.println("JVM file.encoding: " + System.getProperty("file.encoding"));
System.out.println("JVM sun.jnu.encoding: " + System.getProperty("sun.jnu.encoding"));

重启Tomcat后查看应用日志,如果两个参数都是UTF-8,说明配置生效了。

内容的提问来源于stack exchange,提问作者Erik Lievaart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:07:35