• 谈谈字符编码的问题


    一、字符编码历史

      字符编码历史,这里我们引入园友的文章:
        计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处理。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如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属性,因为如此以来,您开发的程序就会受到运行计算机的影响,它会使用当前计算机中所默认的字符编码处理方案.

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

  • 相关阅读:
    JDBC笔记
    MySQL索引
    MySQL事务
    联想笔记本更新BIOS后无法开机,显示自动修复?
    Mysql(笔记)
    [ERROR] Some problems were encountered while processing the POMs: 'modules.module[1]' specifies duplicate child module servlet-01 @ line 13, column 17
    JavaWeb(笔记)
    I/O方式(本章最重要)
    I/O接口
    I/O-外部设备
  • 原文地址:https://www.cnblogs.com/humble/p/3942292.html
Copyright © 2020-2023  润新知