zoukankan      html  css  js  c++  java
  • 谈谈字符编码的问题

    一、字符编码历史

      字符编码历史,这里我们引入园友的文章:
        计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处理。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母‘A’,66代表字母‘B’,以此类推。但是计算机之间字符-数字的对应关系必须得一致,否则就会造成同一段数字在不同计算机上显示出来的字符不一样。因此美国国家标准协会ANSI制定了一个标准,规定了常用字符的集合以及每个字符对应的编号,这就是ASCII字符集(Character Set),也称ASCII码。
        当时的计算机普遍使用8比特字节作为最小的存储和处理单元,加之当时用到的字符也很少,26个大小写英文字母还有数字再加上其他常用符号,也不到100个,因此使用7个比特位就可以高效的存储和处理ASCII码,剩下最高位1比特被用作一些通讯系统的奇偶校

    二、各编码的结构特征


      此后就出现了各国不够用的情况,所以陆续出现格式版本.

      UTF-8:将部分字符编码成一个字节,将部分字符编码成2个字节,将部分字符编码成3个字节,将部分字符编码成4个字节.将128(0X0080)以下的编码成 1个字节(赢美),将(0X0080-0X07FF)编码成两个字节(欧洲,东亚),0X07FF以上使用3个字节编码,最后代理项对编码成4个字节.

      UTF-16:将每个16位字符编码成两个字节,因为不会存在压缩处理,所以性能很好.它也称为UNIOCDE编码

      UTF-32:使用四个字节来编码所有字符,看似万能,但处理性能较低.

      UTF-7:已被UNICODE协会淘汰.

      ASCII:将16字符编码成ascii字符,小于128的的16字符将被用单字节保存所以效率很好,超过的0X07FF的字符是不能转换的,否则字符值会丢失.

     三、C#编码解码例子


    此处引用http://blog.csdn.net/xyjnzy/article/details/5072057
    //1.获得汉字的区位码
    byte[] array = new byte[2];
    array = System.Text.Encoding.Default.GetBytes("");
    
    int i1 = (short)(array[0] - ''/0'');
    int i2 = (short)(array[1] - ''/0'');
    
    
    //2.unicode解码方式下的汉字码
    array = System.Text.Encoding.Unicode.GetBytes("");
    i1 = (short)(array[0] - ''/0'');
    i2 = (short)(array[1] - ''/0'');
    
    
    //3.unicode反解码为汉字
    string str = "4a55";
    string s1 = str.Substring(0,2);
    string s2 = str.Substring(2,2);
    
    
    int t1 = Convert.ToInt32(s1,16);
    int t2 = Convert.ToInt32(s2,16);
    
    
    array[0] = (byte)t1;
    array[1] = (byte)t2;
    
    
    string s = System.Text.Encoding.Unicode.GetString(array);
    
    
    //4.default方式反解码为汉字
    array[0] = (byte)196;
    array[1] = (byte)207;
    s = System.Text.Encoding.Default.GetString(array);
    
    
    //5.取字符串长度
    s = "iam方枪枪";
    int len = s.Length;//will output as 6
    byte[] sarr = System.Text.Encoding.Default.GetBytes(s);
    len = sarr.Length;//will output as 3+3*2=9
    
    
    //6.字符串相加
    System.Text.StringBuilder sb = new System.Text.StringBuilder("");
    sb.Append("i ");
    sb.Append("am ");
    sb.Append("方枪枪");
    
    string --> byte array
    
    byte[] data=Syste.Text.Encoding.ASCII.GetBytes(string);
    
    string --> byte
    
    byte data = Convert.ToByte(string);
    
    byte[]-->string
    
    string string = Encoding.ASCII.GetString( bytes, 0, nBytesSize );

     四、Encodiing类的使用


      Encodiing类中提供了许多静态属性如:Unicode,UTF32,UTF7,ASCII,Default等,它们会返回一个对象用于处理对应的字符编码,值得注意的是不要使用Default属性,因为如此以来,您开发的程序就会受到运行计算机的影响,它会使用当前计算机中所默认的字符编码处理方案.

    五、您若觉得不错的,请支持.

  • 相关阅读:
    Cobbler学习之一--Fedora17下配置Cobbler安装环境
    linux下 tar解压 gz解压 bz2等各种解压文件使用方法
    linux性能检测工具
    firefox的plugin-container进程关闭方法
    部署额外域控制器,Active Directory
    利用yum下载软件包的三种方法
    HP iLo2 试用序列号
    (转)Linux下root密码丢失和运行级别错误的解决办法
    linux下的5个查找命令
    (转)CentOs上配置samba服务
  • 原文地址:https://www.cnblogs.com/humble/p/3942292.html
Copyright © 2011-2022 走看看