有朋友可能会说,直接Unicode.GetBytes,但是我最后要Socket发送的是gb2312啊。请大家帮帮忙

解决方案 »

  1.   

    用GB2312,你得不到你要的结果。GB2312只收录了6,763个汉字,而char的取值范围为6万多个。因此,不是所有的char都能用GB2312来表示的。
    具体GB2312可以表示那些字符,可参考纽约大学的对照表:
    http://cs.nyu.edu/~yusuke/tools/unicode_to_gb2312_or_gbk_table.html从该表可以看到(char)65380,也就是U+FF64不仅在GB2312中不收录,连GBK(收录约2万多字)也不支持。
      

  2.   

    谢谢你的答复,想追问下,(char)65380是我现实的需求,需要socket发送出去,那照这个样子,我岂不是无法send这个字符了?
      

  3.   

    谢谢你的答复,想追问下,(char)65380是我现实的需求,需要socket发送出去,那照这个样子,我岂不是无法send这个字符了?为什么一定要以字符串形式发送,直接发送二进制流不行吗?
    byte[] b = BitConverter.GetBytes(65380);
      

  4.   


    因为报文拼接后,是个string,其实在编译的时候,我是能查看到string每个字符的,但是string转byte[]之后,就转不成功了
    如果说gb2312不能识别这些字符,为什么单步的时候能够查看呢
      

  5.   

    string是没有编码属性的,当下的情况来说它只能是Unicode。
    只有byte[]才有编码一说,而其他各种编码范围都只是Unicode的一个子集,当然也就有可能出现非法编码。而有些非法编码与该编码解析方式有冲突,你说这种情况下该怎么处理这些非法编码呢?
      

  6.   


    因为报文拼接后,是个string,其实在编译的时候,我是能查看到string每个字符的,但是string转byte[]之后,就转不成功了
    如果说gb2312不能识别这些字符,为什么单步的时候能够查看呢是不是你的转换方法有问题,通常的做法是在发送端用Encoding.GetBytes将字符串转为字节数组,然后通过socket发送,在发送时,还需要将字节数组的长度放在内容前面。在接收端,首先接收字节数组的长度,再通过此长度用Encoding.GetString方法转换回字符串。在整个过程中,一般不使用字符数组做中间媒介。
      

  7.   

    +1
    直接字符串和byte数组做转换,不要再转char[ ]
    socket通信,两边要求字符串编码不同,那就必须直接发送byte[ ],而不是发送string
      

  8.   


    报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63
      

  9.   

    既然是char数组,为什么一定要去编码成byte再传?
    你不会直接将char数组转换成byte数组吗?
      

  10.   


    报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63你加密好以后的 byte[]不要再转成string了。直接发送不就好了么?加密后的数组已经被打乱,如果你要再转成String肯定有可能会出现乱码,而且无法转回原先的byte[]。如果你非要显示,你可以用Convert.ToBase64String()。
      

  11.   

    报文本身是string,这本身就不合理.
    你要发送string,就必须是一个可读的字符串,而接收方也必须跟你的编码一致
    你要加密,string就变成不可读,那为什么还要发送string?
      

  12.   

    char可以65535,而byte只能255
    一个char转成两个byte啊
      

  13.   


    报文本身是string,send的本身也是byte,直接转,没问题。但是过程中,我需要对string进行一些算法加密,加密完后的新string有些是不可见字符,转成byte就有问题了,转不了,只能转成?这个符号,也就是63加密通常都是在字节级的,所以加密的结果应该就是byte[],何苦又把它转成字符串呢。如果实在蛋疼的厉害要转成字符串,建议使用Base64.