none
关于POP3的字符编码 RRS feed

  • 问题

  • 通过POP3初始化:

                public TcpClient tcpClient;
                public NetworkStream NetStream;
                public StreamReader streamRead;
                    tcpClient = new TcpClient(PopServer_Domain, PopServer_NetPort);
                    NetStream = tcpClient.GetStream();
                    //streamRead = new StreamReader(NetStream, Encoding.Default);
                    streamRead = new StreamReader(tcpClient.GetStream());

    通过RETR读取邮件内容,碰到一个问题——字符串编码;

    如:Subject: =?gb2312?B?Rnc6IEZ3OiDH69TEuavO8dPKvP6jurnY09q/qtW5MjAxMMTq08XQ48jLssXGwNGhuaTX9w==?=  //这是指邮件标题

    看到一开始的 ?gb2312?,我想我可以认为它是GB2312的编码。于是我把其中的“Rnc6IEZ3OiDH69TEuavO8dPKvP6jurnY09q/qtW5MjAxMMTq08XQ48jLssXGwNGhuaTX9w==”过滤出来作为标题,它的长度是72个字符。

    现在的问题是:不管我怎么使用C#自带的转换工具来转换为GB2312,我最终得到的都是以上这72个字符;(returnValue.Subject是以上这个72个字符的变量,类型String)

    1)

    Stream strm = new MemoryStream(Encoding.ASCII.GetBytes(returnValue.Subject));

    StreamReader sr = new StreamReader(strm, subjectEncoding);

    2)
    byte[] byteArray = Encoding.ASCII.GetBytes(returnValue.Subject);
    returnValue.Subject = Encoding.GetEncoding(subjectEncoding.BodyName).GetString(byteArray);

    http://zh.wikipedia.org/wiki/GB_2312#.E6.B3.A8.E9.87.8B得知GB2312的字节结构,难道我真的要自己手动编写转换程序?求教了。

    2011年4月8日 7:27

答案

  • 您好, 邮件的编码格式是 base64编码,楼主可以查一下这个编码。 你可以用下面的代码得到你的中文:

     

     static void Main(string[] args)
            {
                string subject = "Rnc6IEZ3OiDH69TEuavO8dPKvP6jurnY09q/qtW5MjAxMMTq08XQ48jLssXGwNGhuaTX9w==";

                subject = DecodeBase64("GB2312", subject); //subject=Fw: Fw: 请阅公务邮件:关于开展2010年优秀人才评选工作

            }

            public static  string DecodeBase64(string code_type, string code)
            {
                string decode = "";
                byte[] bytes = Convert.FromBase64String(code);
                try
                {
                    decode = Encoding.GetEncoding(code_type).GetString(bytes);
                }
                catch
                {
                    decode = code;
                }
                return decode;
            }

    • 已建议为答案 mazhou 2011年4月8日 9:54
    • 已标记为答案 mldarkMember 2011年4月9日 16:09
    2011年4月8日 8:40

全部回复

  • 您好, 邮件的编码格式是 base64编码,楼主可以查一下这个编码。 你可以用下面的代码得到你的中文:

     

     static void Main(string[] args)
            {
                string subject = "Rnc6IEZ3OiDH69TEuavO8dPKvP6jurnY09q/qtW5MjAxMMTq08XQ48jLssXGwNGhuaTX9w==";

                subject = DecodeBase64("GB2312", subject); //subject=Fw: Fw: 请阅公务邮件:关于开展2010年优秀人才评选工作

            }

            public static  string DecodeBase64(string code_type, string code)
            {
                string decode = "";
                byte[] bytes = Convert.FromBase64String(code);
                try
                {
                    decode = Encoding.GetEncoding(code_type).GetString(bytes);
                }
                catch
                {
                    decode = code;
                }
                return decode;
            }

    • 已建议为答案 mazhou 2011年4月8日 9:54
    • 已标记为答案 mldarkMember 2011年4月9日 16:09
    2011年4月8日 8:40
  • 谢谢。

    2011年4月12日 8:12
  • 我试过了,确实是Base64的编码的。谢谢了~~!
    2011年4月12日 8:46