我在用C#读取手机短信时如果发过来的短信内容全是英文或者全是数字就出现乱码,而其中只要有一个中文就不会出现乱码,请问这个问题要怎么解决啊,大家帮帮吧,谢谢了!!!!

解决方案 »

  1.   

    这是代码:
      public string StandardSms(string msgStr)
            {
                string msgStrContent = "";
                if (msgStr.Contains("OK"))
                {                string[] tStr = msgStr.Split('\r');
                    for (int i = 0; i < tStr.Length; i++)
                    {
                        string pdu = "";
                        if (tStr[i].IndexOf('\n') == 0)
                        {
                            pdu = tStr[i].Substring(1);
                        }
                        if (pdu != "")
                        {
                            if (pdu.Substring(0, 2) == "08")
                            {
                                                            msgStrContent += pduEncoding.GetTextFromPdu_UCS2(pdu);                        }                        else if (pdu.Substring(0, 2) == "00")
                            {
                                                            msgStrContent += pduEncoding.GetTextFromPdu_7Bit(pdu).Replace("\0", "");
                            }
                        }
                    }            }
                return msgStrContent;
            }        
     public string GetTextFromPdu_UCS2(string pdu) //解析短信正文函数_UCS2编码 
            {
                //截取PDU串中短信正文部分源码,读者也可用BitConverter函数实现部分转换             string TextInPdu = pdu.Substring(58);
                string Text = "";
                char[] d = TextInPdu.ToCharArray();//存入字符数组 
                for (int i = 0; i < d.Length; i += 4)
                {
                    int unicode_nu = 0;
                    for (int m = 0; m < 4; m++) //计算 Unicode 十进制值 
                    {
                        if (i + m > d.Length - 1) break;
                        unicode_nu += HexToDec(d[i + m]) * (1 << ((3 - m) * 4));
                    }
                    Text += (char)unicode_nu; //输出 Unicode 对应字符 
                }
                return Text;//返回短信正文内容         }
    public string GetTextFromPdu_7Bit(string pdu) //解析短信正文函数_7-Bit编码 
            {
                string TextInPdu = pdu.Substring(58);//截取PDU串中短信正文部分源码 
                string Text = "";
                while (TextInPdu.Length % 14 != 0) //最后一组不满7个成员时补"0" 
                    TextInPdu += "0";
                char[] a = TextInPdu.ToCharArray(); //将源码存入字符数组 a[] 
                string b = "";
                for (int i = 0; i < a.Length; i++) //将源码转为二进制并存入字符串 b 
                    b += GetBinary(a[i]);
                char[] total = b.ToCharArray(); //将二进制码存入字符数组 total[] 
                for (int j = 0; j < total.Length; j += 56) //56位二进制码为一组,循环所有组   
                {
                    char[] s = new char[56];
                    for (int i = 0; i < 56; i++)  //将一组二进制码拷贝到字符数组 s[] 
                        s[i] = total[i + j];
                    char[] d = new char[56];
                    //------------------------------------------------------------------------------------- 
                    for (int i = 0; i < 7; i++) //组内解码得到目标二进制码数组 d[] 
                        d[i] = s[i + 1];
                    for (int k = 1; k <= 6; k++)
                    {
                        for (int i = k * 7; i < (k + 1) * 7 - k; i++)
                            d[i] = s[i + (k * 2 + 1)];
                        for (int i = (k + 1) * 7 - k; i < (k + 1) * 7; i++)
                            d[i] = s[i - ((7 - k) * 2 + 1)];
                    }
                    for (int i = 49; i < 56; i++)
                        d[i] = s[i - 1];
                    //------------------------------------------------------------------------------------- 
                    for (int k = 0; k < 56; k += 7) //组内循环得到目标 ASCII 字符         
                    {
                        int ascii_nu = 0;
                        for (int m = 0; m < 7; m++)
                            ascii_nu += Convert.ToInt16(d[k + m].ToString()) * (1 << (6 - m));
                        Text += (char)ascii_nu; //输出 ASCII 码相应字符 
                    }
                }  // END OF loop j 
                return Text;
            }
      

  2.   

    你的数字或英文的时候调用的方法里面的算法有问题
    http://www.lvtaostudio.com