本帖最后由 qinguan0619 于 2011-11-15 16:10:22 编辑

解决方案 »

  1.   

    现在都unicode了,还用gbk干嘛,建议用utf8或者utf16
      

  2.   

    Encoding.Default应该是可以处理中文的,出现什么样的错误?
      

  3.   


    开始一直用的就是Encoding.Default,在下面一句代码
     Encoding.Default.GetBytes(this.MessageBody, 0, this.MessageLength - 10, buffer, 10);
    就碰了这个问题,不能处理中文,报错如下:
    未处理的异常: System.ArgumentOutOfRangeException: 索引和计数必须引用该字符串内
    的位置。
    参数名: s
      在 System.Text.EncodingNLS.GetBytes(String s, Int32 charIndex, Int32 charCoun
    t, Byte[] bytes, Int32 byteIndex)
      

  4.   

    Encoding.GetBytes的第三个参数是字符个数,用this.MessageLength - 10是完全错误的,应该是MessageBody的长度,如果MessageBody是string的话,应该这样:Encoding.Default.GetBytes(this.MessageBody, 0, MessageBody.Length, buffer, 10);
      

  5.   

    MessageBody的确是string类型的,第三个参数也是字符的个数,即MessageBody的长度,MessageLength是buffer的长度,包括MessageBody以及其它一些头部信息,10是头部信息的长度,所以this.MessageLength - 10 = MessageBody.Length,应该是没有问题的。
    我换了个方式,把MessageBody类型由string改成了byte[] ,可以读中文了,费解 。
      

  6.   

    你看一下代码,this.MessageLength - 10 不等于 MessageBody.Length而是:this.MessageLength - 10 =Encoding.Default.GetByteCount(this.MessageBody)Encoding.Default.GetByteCount(this.MessageBody)是MessageBody编码后的长度,不等于MessageBody.Length,如果是utf7/utf8的话,英文字符数正好等于编码后的字节数,这只是巧合而已,因为在utf7下,一个英文字符只占用一个字节,但在utf7下,一个中文字符就会多于一个字节,所以中文会出错,你试过MessageBody.Length没有?
      

  7.   


    差点忘了结贴了,我把所有数据都存成byte类型,问题解决了。
    当时也不记得有没有试过MessageBody.Length,就是用string类型时老是碰到各种问题。