views:

43

answers:

2

Hi,

I have a setup, where emails received by mail server(postfix) are taken on and the resulting email's body(html or plain text) and attachments are parsed to separate files and saved, for this i use javax mail api.

The problem occurs for email body when it is in Chinese (simple and traditional) (charset GB2312, as per email header) or Korean (charset ks_c_5601-1987, as per email header),

the resulting parsed email bodies show character corruption (the characters are displayed as '?').

Also even if I am explicitly saving the charset to be the one as suggested by email header the problem remains same.

I am unable to understand why rest of the programs like Google mail, Outlook can parse the mail body right while my code could not.

Please suggest what am i doing wrong?

Adding the sample code(after i narrowed down the problem):

The Chinese text is as follows (saved it on my machine with UTF-8 encoding):

高雄市颱風天淹水,高雄市長陳菊「休息」挨批,國民黨今天(10月1日)在高雄市三多商圈豎立看板,上面是一個撐著雨傘的民眾,示意要大家安靜,旁邊就寫著「噓!陳菊市長在睡覺」。這個看板明顯是在諷刺陳菊市長颱風天下午在官邸休息。國民黨籍議員在議會依舊持續砲轟。

    國民黨在三多商圈設立看板「噓!陳菊市長在睡覺」,諷刺意味不言可喻,國民黨籍高雄市議員陳麗娜說,其實很多官員真的都不敢叫醒陳菊市長。看板的內容,路過民眾一看就知道講的是哪件事,有的民眾覺得疲勞休息無可厚非,但也有人認為市長休息,不應該沒有人代理指揮救災。

    國民黨團議員持續在議會質詢陳菊救災不力,對於國民黨豎立的看板,陳菊則是表示尊重,不與置評。天天遭到砲轟,陳菊的心情每天都很沉重。
中新网北京10月1日电 今天是中华人民共和国成立61周年纪念日。今天上午,党和国家领导人胡锦涛、温家宝、贾庆林、李长春、习近平、李克强、贺国强、周永康等,同首都各界代表一起来到天安门广场,向人民英雄纪念碑敬献花篮,深切缅怀为实现民族独立、人民解放和国家富强、人民幸福英勇献身的革命先烈。


随后,全场肃立,向为中国人民解放事业和共和国建设事业英勇献身的烈士们默哀。

  中共中央,全国人大常委会,国务院,全国政协,中央军委,各民主党派、全国工商联和无党派爱国人士,各人民团体,首都各界群众,中国少年先锋队分别敬献的9个大型花篮,一字排开地摆放在人民英雄纪念碑北侧。一个个花篮的红色缎带上写着“人民英雄永垂不朽”8个金色大字,一朵朵盛开的鲜花散发出缕缕清香,寄托着对革命先烈的无限敬仰和无尽怀念。

  在军乐队演奏的激昂深情的《献花曲》旋律中,18名礼兵抬起9个花篮,正步走向人民英雄纪念碑,将花篮摆放到纪念碑基座前。

  胡锦涛等党和国家领导人缓步登上纪念碑基座,在花篮前驻足凝视。

  胡锦涛神情庄重地走近花篮,仔细整理花篮上的红色缎带。

  接着,胡锦涛等党和国家领导人绕行一周,深情瞻仰人民英雄纪念碑。碑座四周的大型浮雕,记载着近代以来中国人民顽强不屈的奋斗历程。胡锦涛等边走边看,向人民英雄致以深深的敬意。

  伴随着动人的乐曲声,首都各界代表排成纵队,依次登上纪念碑基座。他们当中,有身经百战的老战士代表,有胸佩奖章的劳动模范代表,有为成功举办北京奥运会、残奥会做出突出贡献的先进集体和先进个人代表,有来自基层的工人、农民、科技工作者、大中学校师生代表,有军容严整的人民解放军和武警部队官兵,有身着鲜艳服装的少数民族代表,有戴着红领巾的少年儿童……在这个庄严的时刻,人们怀着崇敬的心情瞻仰人民英雄纪念碑,共同缅怀革命先烈的丰功伟绩。

  敬献花篮仪式由中共中央政治局委员、北京市委书记刘淇主持。

Following is the code that parses it and character corruption occurs:

        @Test
    public void testStream() throws IOException{
        FileInputStream in = new FileInputStream("C:\\EmailTest\\Chinese2.txt");        
        String Body = convertStreamToString(in);        

        FileOutputStream fileout = new FileOutputStream("C:\\Out.txt");    
        fileout.write(Body.getBytes(Charset.forName("GB2312")));
        in.close();        
        fileout.flush();
        fileout.close();        
    }

public String convertStreamToString(InputStream is) throws IOException {
        if (is != null) {
            StringBuilder sb = new StringBuilder();
            String line;

            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
            } finally {
                is.close();
            }
            return sb.toString();
        } else {
            return "";
        }
    }

The resulting Chinese is as follows:

?高雄市??天淹水,高雄市??菊「休息」挨批,?民?今天(10月1日)在高雄市三多商圈?立看板,上面是一??著雨?的民?,示意要大家安?,旁?就?著「?!?菊市?在睡?」。??看板明?是在?刺?菊市???天下午在官邸休息。?民?籍??在??依?持???。

    ?民?在三多商圈?立看板「?!?菊市?在睡?」,?刺意味不言可喻,?民?籍高雄市????娜?,其?很多官?真的都不敢叫醒?菊市?。看板的?容,路?民?一看就知道?的是哪件事,有的民??得疲?休息?可厚非,但也有人??市?休息,不???有人代理指?救?。

    ?民????持?在?????菊救?不力,?於?民??立的看板,?菊?是表示尊重,不?置?。天天遭到??,?菊的心情每天都很沉重。
中新网北京10月1日电 今天是中华人民共和国成立61周年纪念日。今天上午,党和国家领导人胡锦涛、温家宝、贾庆林、李长春、习近平、李克强、贺国强、周永康等,同首都各界代表一起来到天安门广场,向人民英雄纪念碑敬献花篮,深切缅怀为实现民族独立、人民解放和国家富强、人民幸福英勇献身的革命先烈。


随后,全场肃立,向为中国人民解放事业和共和国建设事业英勇献身的烈士们默哀。

  中共中央,全国人大常委会,国务院,全国政协,中央军委,各民主党派、全国工商联和无党派爱国人士,各人民团体,首都各界群众,中国少年先锋队分别敬献的9个大型花篮,一字排开地摆放在人民英雄纪念碑北侧。一个个花篮的红色缎带上写着“人民英雄永垂不朽”8个金色大字,一朵朵盛开的鲜花散发出缕缕清香,寄托着对革命先烈的无限敬仰和无尽怀念。

  在军乐队演奏的激昂深情的《献花曲》旋律中,18名礼兵抬起9个花篮,正步走向人民英雄纪念碑,将花篮摆放到纪念碑基座前。

  胡锦涛等党和国家领导人缓步登上纪念碑基座,在花篮前驻足凝视。

  胡锦涛神情庄重地走近花篮,仔细整理花篮上的红色缎带。

  接着,胡锦涛等党和国家领导人绕行一周,深情瞻仰人民英雄纪念碑。碑座四周的大型浮雕,记载着近代以来中国人民顽强不屈的奋斗历程。胡锦涛等边走边看,向人民英雄致以深深的敬意。

  伴随着动人的乐曲声,首都各界代表排成纵队,依次登上纪念碑基座。他们当中,有身经百战的老战士代表,有胸佩奖章的劳动模范代表,有为成功举办北京奥运会、残奥会做出突出贡献的先进集体和先进个人代表,有来自基层的工人、农民、科技工作者、大中学校师生代表,有军容严整的人民解放军和武警部队官兵,有身着鲜艳服装的少数民族代表,有戴着红领巾的少年儿童……在这个庄严的时刻,人们怀着崇敬的心情瞻仰人民英雄纪念碑,共同缅怀革命先烈的丰功伟绩。

  敬献花篮仪式由中共中央政治局委员、北京市委书记刘淇主持。

Is it because of Java stream classes that I am facing the problem?

thanks in advance

Ashish

A: 

I have a feeling that the problem is related to the number of bytes required to fully represent Chinese characters. You may want to look into the details of Java's Unicode support and the size of the byte primitive.

Alternatively, there may be a problem converting the bytes back to UTF-8.

Either way, you should take a look at the input and output files with a hex editor that lets you fiddle with the Unicode mode and BOM (or lack thereof).

Zian Choy
+1  A: 

This problem arises because you are using incorrect encoding. If I take your code, replace "GB2312" with "GB18030" - it works as expected.

Neeme Praks
Actually the email headers were giving the incorrect encoding, so had to make a mechanism to replace the correct encoding first and then decode. Thanks for the pointing out the correct char set.
Ashish
Good to hear that you got your problem solved!
Neeme Praks