对编码不是很了解
最近写个串口通讯的程序,发现串口最多只能发送8个数据位的字符,所以将汉字转化为byte发送后,接收端会自动减去128的倍数,得到0~128之间的数
比如发送某汉字,转化为byte后为b[0]=138,接收端接收到的就是b[0]=10
而串口最高只能发送8个数据位的字符,所以只能解决汉字的编码问题
请问解决这个问题~~

解决方案 »

  1.   

    汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。
        1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。
        GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。
        GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。
        2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。
        3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。
      

  2.   

    吼吼 自个搞定了 有个叫UTF7编码的东东,将字符转化为7位编码,刚好够用~
    谢谢LS几位~
      

  3.   

    你要把数据当成二进制数据来传输,而不是ASCII码,现在问题是,接收端是你写的吗?如果不是你写的应该有通信的规范吧,如果是你写的,那就简单的,你怎么拆开送过去,你接收的时候再怎么组回来就是了
      

  4.   

    static void Main(string[] args)
      {
      string test = "Clinique 倩碧";
      Console.WriteLine((int)char.MaxValue);
      Char[] charArr = test.ToCharArray();
      Encoding ED = Encoding.GetEncoding("gb2312");
      foreach (char c in charArr)
      {
      byte[] B = ED.GetBytes(new char[] { c });
      Console.WriteLine("" + c + ":" + (int)c + ":" + ED.GetString(B) + ":0x" + Convert.ToString(c,16) );
        
      }
      byte[] B1 = ED.GetBytes(new char[] { (char)0x5029 });
      Console.WriteLine(ED.GetString(B1));
      byte[] B2 = ED.GetBytes(new char[] { (char)0x78a7 });
      Console.WriteLine(ED.GetString(B2));  for (int i = 0; i < 256; i++)
      {
      //Console.WriteLine(i.ToString() + ":" + Encoding.ASCII.GetString(new byte[] { (byte)i }));
      }
      //Console.WriteLine(byte.MaxValue);
      Console.Read();
      }