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属性,因为如此以来,您开发的程序就会受到运行计算机的影响,它会使用当前计算机中所默认的字符编码处理方案.

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

  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/humble/p/3942292.html
Copyright © 2011-2022 走看看