【问题标题】:Java encoding breaks between Mac and some Linux boxesMac 和一些 Linux 机器之间的 Java 编码中断
【发布时间】:2014-08-09 05:51:37
【问题描述】:

我有这个问题,在我的本地开发机器和一个 AWS Linux 机器上,UTF-8 字符串被正确编码,但在另一台机器上它们被替换为问号。字符串源自 MIME 电子邮件,并且都源自公共代码路径。正确编码和问号之间的差异出现在 stderr 和我们上传到的 AWS S3 上的文件中。我已经在 IntelliJ 和 本地运行,使用部署到损坏的 Linux 盒子的完全相同的 jar。

在所有机器上,Java 的版本都是相同的:

java 版本“1.7.0_04” Java(TM) SE 运行时环境 (build 1.7.0_04-b20) Java HotSpot(TM) 64 位服务器 VM(内部版本 23.0-b21,混合模式)

我使用以下程序来验证默认字符集是否在所有地方都相同:

public class Test {

    public static void main(String[] args) {
        System.err.println(java.nio.charset.Charset.defaultCharset());    
    }
}

所有框都显示

UTF-8

我们将所有 MIME 字符串作为字节保存在内存中,然后通过以下代码以 UTF-8 编码字符串返回更高级别的代码:

static final Charset charset = Charset.forName("UTF8");
// ...
return new String(bytes, ImapClient.charset);

然后通过InputStream mimeStream = IOUtils.toInputStream(mime) 将其转换为InputStream 并通过org.apache.james.mime4j.stream.MimeTokenStream 进行解析。

当我们到达未能正确编码的主题字段时,我们使用

public static String decodeBodyText(String str) {
    try {
        return MimeUtility.decodeText(str);
    }
    catch (UnsupportedEncodingException exc) {
        // ignore
    }
    return str;
}

MimeUtility 来自 javax.mail.internet 包。

这是随后在 System.err.println 通话中以不同方式显示的主题。

是什么导致了这种不正确的编码?

【问题讨论】:

    标签: java encoding mime


    【解决方案1】:

    缺少-Dmail.mime.charset=utf-8。由于某种原因,这在不同机器上的默认值有所不同,但这修复了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多