我有這個問題,在我的本地開發機器和一個AWS Linux機器上,UTF-8字符串被正確編碼,但在另一臺機器上它們被替換爲問號。這些字符串起源於MIME電子郵件,並且都源自一個公共代碼路徑。正確的編碼和問號之間的區別出現在stderr和我們正在上傳的AWS S3上的文件中。我已經在IntelliJ和上使用完全相同的jar來部署到破碎的Linux機器上。在Mac和一些Linux機器之間的Java編碼中斷
在所有機器上的Java版本是一樣的:
Java版本 「1.7.0_04」 的Java(TM)SE運行時環境(建立1.7.0_04-B20) Java的熱點(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
呼叫中以不同方式顯示的主題。
是什麼導致了這種不正確的編碼?