none
Pop3接收Iphone邮件时中文都变成了问号 RRS feed

  • 问题

  • 我在用TcpClient通过pop3接收邮件时,iphone之外的邮件如果有乱码,换一种编码则可正常显示中文。

    但接收iphone的邮件时,无论指定什么编码都是一个问号。

    后来试过多个c#接收邮件的第三方组件,千篇一律的中文变问号?

    再后来用c# Socket,telnet,python都试过,结果都是一样的

    -----------------------------------------------------------------------------------------

    后来的后来直接接收二进制数据不转码,调试时中文处字节码都是63,即还是问号,

    -----------------------------------------------------------------------------------------

    关键是foxmail等其他软件却能正常显示中文。它们的接收方式难道有什么本质性的不同?

    没有人遇到过吗?

    • 已编辑 Davy.Ye 2015年10月1日 2:57
    2015年9月27日 2:43

全部回复

  • 我在用TcpClient通过pop3接收邮件时,iphone之外的邮件如果有乱码,换一种编码则可正常显示中文。

    但接收iphone的邮件时,无论指定什么编码都是一个问号。

    后来直接接收二进制数据,调试时中文处字节码都是63,即还是问号,而foxmail等其他软件却能正常显示中文。

    请问,我接收不到正常的中文字符数据的原因是什么?

    后来试过多个c#接收邮件的第三方组件,千篇一律的中文变问号,是不是我们都漏掉了什么细节?


    收到乱码一般都是由于编码原因。比如server发给你utf-8,你收到后用gb2312去解析,那结果肯定是有问题的。你可以去查查看server端伐给你的时候的编码格式,然后解析的时候也用这种编码格式。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年9月28日 3:09
    版主
  • 能把你的代码贴出来我们一起看看么?
    2015年9月29日 1:36
  •     public byte[] GetBytes(int emailNum)
        {

    // TcpClient sender = new TcpClient(POPServer, mPOPPort);

            // NetworkStream ns = sender.GetStream();

            //前面还有连接登录的过程

            string input = "retr " + emailNum + "\r\n";
            byte[] outbytes = System.Text.Encoding.UTF8.GetBytes(input);
            ns.Write(outbytes, 0, outbytes.Length);

    //为了不受字符编码的影响,直接接受字节流

    //但是调试时,依然中文位置为?,字节值为63

            MemoryStream ms = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(ms);
            BinaryReader br = new BinaryReader(ns);
            byte flag = 0;
            byte temp;
            while (true)
            {

      //因为连接没有中断,用缓冲区读取会一直等待,所以一个一个读取,用\r\n.\r\n判断读取结束

               temp = br.ReadByte();
                bw.Write(temp);
                if (temp != '\r' && temp != '\n' && temp != '.')
                    flag = 0;
                else
                {
                    if (temp == '\r' && flag != 3) flag = 1;
                    if (temp == '\n' && flag != 4) flag = 2;
                    if (temp == '.' && flag == 2) flag = 3;
                    if (temp == '\r' && flag == 3) flag = 4;
                    if (temp == '\n' && flag == 4) break;
                }

            }
            return ms.ToArray();
        }

    2015年9月30日 2:51