2014-06-18 55 views
0

我有這個問題,在我的本地開發機器和一個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; 
} 

MimeUtilityjavax.mail.internet包。

這是在System.err.println呼叫中以不同方式顯示的主題。

是什麼導致了這種不正確的編碼?

回答

0

不見了-Dmail.mime.charset=utf-8。由於某種原因,這在不同的機器上有不同的默認值,但是這固定了它。

相關問題