【发布时间】: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 通话中以不同方式显示的主题。
是什么导致了这种不正确的编码?
【问题讨论】: