• 代码页


      最近写一个网络程序时,碰到字符串和字节数组之间的转换问题,开始时还比较简单,字符串都是标准的Ascll编码,处理起来比较简单:
      字符串转字节数组 byte [] bts=Encoding.ASCII.GetBytes(str);
      字节数组转字符串 string str=Encoding.ASCII.GetString(bts);
      但是后来发送的数据不仅仅是Ascii码了,而是连普通字节都有,这种情况下,就比较麻烦了,因为ASCII代码页(这还是后来才学到的)只支持7个位,也就是说,高位为1的话,全部被转化为63,显示为?。逆向转换就不行了。
      在网上学习,知道了其实编码规则是由许多的代码页决定的,但vs2005帮助里只提到几种编码:utf-8,utf-7,unicode等,基本都是多字节的。
      我希望的,还是单字节的代码页,能够支持全字节的转换的,127之上的字节,显示为乱码也无所谓。
      关于代码页,http://amoderlan.blogbus.com/logs/4860636.html 比较靠谱,其他还有一些,列的东西到多,但是很多都是空的,难于检查。
      为了得到我想要的东西,写了一小段程序,检查各个代码页的效果。
                byte[] bys=new byte[4];
                bys[
    0= 56;
                bys[
    1= 156;
                bys[
    2= 156;
                bys[
    3= 56;

                
    byte[] b2 = new byte[4];
                
                Encoding en 
    =  Encoding.GetEncoding(20127);
                
    string ret = "";
                ret 
    += "编码名称:" + en.EncodingName + Environment.NewLine;
                ret 
    += "编码代码:" + en.CodePage.ToString() + Environment.NewLine; ;
                ret 
    += "是否单字节:" + en.IsSingleByte.ToString() + Environment.NewLine;
                ret 
    += "字符串长度:" + en.GetString(bys).Length.ToString() + Environment.NewLine;
                ret 
    += "内容:" + en.GetString(bys) + Environment.NewLine;
                b2 
    = en.GetBytes(en.GetString(bys));
                
    string dc="成功";
                
    for (int i = 0; i < bys.Length; i++)
                
    {
                    
    if (bys[i] != b2[i]) dc = "失败";
                }

                ret 
    += "两次转换能否还原:" + dc+Environment.NewLine;
                textBox1.Text 
    = ret;

      得到了我想要的东西:

    编码名称:US-ASCII
    编码代码:20127
    是否单字节:True
    字符串长度:4
    内容:8??8
    两次转换能否还原:失败


    编码名称:IBM EBCDIC (美国-加拿大)
    编码代码:37
    是否单字节:True
    字符串长度:4
    内容:˜ææ˜
    两次转换能否还原:成功

    编码名称:OEM 美国
    编码代码:437
    是否单字节:True
    字符串长度:4
    内容:8££8
    两次转换能否还原:成功

    编码名称:IBM EBCDIC (国际)
    编码代码:500
    是否单字节:True
    字符串长度:4
    内容:˜ææ˜
    两次转换能否还原:成功

    编码名称:阿拉伯字符(ASMO-708)
    编码代码:708
    是否单字节:True
    字符串长度:4
    内容:8œœ8
    两次转换能否还原:成功

    编码名称:阿拉伯字符(DOS)
    编码代码:720
    是否单字节:True
    字符串长度:4
    内容:8££8
    两次转换能否还原:成功

    编码名称:希腊字符(DOS)
    编码代码:737
    是否单字节:True
    字符串长度:4
    内容:8εε8
    两次转换能否还原:成功

    编码名称:OEM 西里尔语
    编码代码:855
    是否单字节:True
    字符串长度:4
    内容:8юю8
    两次转换能否还原:成功


    有兴趣还可以检查其他的代码页,这是源代码:
    https://files.cnblogs.com/jetz/WindowsApplication1.rar

  • 相关阅读:
    左旋转字符串
    swoole(8)http服务
    整数反转
    两数之和
    广度优先搜索
    快速排序
    JavaScript当中的eval函数
    JavaScript中的作用域链原理
    git push和git pull
    cherry-pick,revert和rebase使用的3-way合并策略
  • 原文地址:https://www.cnblogs.com/jetz/p/877798.html
Copyright © 2020-2023  润新知