代码页

  最近写一个网络程序时,碰到字符串和字节数组之间的转换问题,开始时还比较简单,字符串都是标准的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 两次转换能否还原:成功

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏osc同步分享-java技术分享站

Timer类的schedule()方法

timer.schedule(new MyTask(),long time1,long timer2); 第一个参数,是 TimerTask 类,在包:impo...

358110
来自专栏安恒网络空间安全讲武堂

二进制学习系列-堆溢出

在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。 对于子类,最开始的内存...

26430
来自专栏Java后端技术栈

Java性能优化之字符串优化处理

String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也...

12050
来自专栏AI研习社

正则表达式教程:实例速查

正则表达式(regex 或 regexp)在文本信息提取方面是非常有用的工具,通过查询一个或多个特定搜索模式的匹配实现(例如,特定的ASCII或unicode字...

10730
来自专栏zaking's

用js来实现那些数据结构02(数组篇02-数组方法)

    上一篇文章简单的介绍了一下js的类型,以及数组的增删方法。这一篇文章,我们一起来看看数组还有哪些用法,以及在实际工作中我们可以用这些方法来做些什么。由于...

417110
来自专栏灯塔大数据

技术 | Python从零开始系列连载(十一)

导读 为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极习转载~ 上一期学习了...

396100
来自专栏程序手艺人

C++之对象的销毁

37280
来自专栏java一日一条

Java中关于String类型的10个问题

简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等。只要你想检测俩字符串是不是相等的,你就必须...

7510
来自专栏python3

python3--面向对象进阶之内置方法

print执行时,是去内部寻找__str__方法,所以print没有输出不了的数据,因为每一个对象都有__str__方法

8710
来自专栏Crossin的编程教室

【Python 第67课】函数的参数传递(1)

本篇面向读者:有一点点 Python 基础 关键字:函数,参数,默认值 先说下上次课最后留的那题,我自己的解法: print ';'.join([str(i) ...

29250

扫码关注云+社区

领取腾讯云代金券