zoukankan      html  css  js  c++  java
  • 关于字符编码的一些理解和总结

    编码们的前世今生

    因为计算机语言是国外的产物所以最初的编码是ASCII码只能存储256位。这对于使用英语的外国人来说128位就完全够用了,还能剩余128位。

    随着计算机语言的发展,越来越多的国家开始使用,于是各国都开始对ASCII码的后128位进行扩展。

    我们中国的汉字博大精深,128位想想也是不够用的。于是我们发明了GB2312。它可以存储约7000多个汉字,这是符合当时的需求的。GB2312并不是存储在ASCII码的后128位中,而是与ASCII码的后128位产生了一个映射关系。

    随着中国计算机的快速发展,GB2312也不够用了,于是就有了我们现在广为流传的GBK,它收录了21866个汉字加特殊符号等。目前最新使用的应该是GB18030收录了27484个汉字加特殊符号等。

    这时有一个急需解决的问题,中国有GBK,日本以及其他国家也有自己的编码语言,照这样下去编码语言是非常混乱的,于是国际ISO组织设立了一个统一编码。它就是万国码UNICODE。

    UTF-8诞生了

    ASCII码是占了1个字节,UNICODE码是占了2个字节,如果外国的程序从1个字节转移到2个字节是非常消耗内存的,于是出现了一种可变长度的字符编码即UTF-8,它其实是UNICODE的子集。UTF-8在存储英文字符时使用的是ASCII码格式,在存储汉字时使用的是UTF-8格式且存中文字符需要3个字节。在UNICODE码无论中文还是英文都占2个字节。

    实战吧

    对于我们而言,最常见的转码应该就是GBK->UTF-8 又或是反过来UTF-8到GBK

    我们知道UNICODE它是收录了所有的编码格式的,所以我们可以把GBK或者UTF-8看做是它的子集。

    如果我们要把UTF-8转换成GBK,那第一步就要先用UNICODE来解码。比如:

    str='我爱中国'
    str_to_unicode=str.decode('UTF-8')

    decode后面的解码格式是一成不变的吗?当然不是!括号里面的解码格式取决于你当前这个字符串是什么格式,这里拿py2来举例。

    py2的默认编码格式是UTF-8,所以我们这里就填入的是UTF-8

    这个时候字符串的编码格式已经变成了UNICODE,实际上到了这里中文是已经可以识别的,因为上面有讲到GBK是UNICODE的子集。

    但是打印出来的可能不是中文而是u’u460类似这种,这个时候可以修改工具设置的默认编码语言或者转换成你的系统可以识别的编码格式。

    比如说你的系统默认编码语言是GBK,那我们就再编码成GBK格式就可以了。如下:

    unicode_to_gbk=str_to_unicode.encode('GBK')

    在实际运用中,我们经常碰到这样的问题,要从A系统获取一个数据在B工具上使用。(这里很重要)

    首先要考虑的是A系统的默认编码语言是什么,如果是GBK,那么解码的时候就用GBK。

    其次要考虑的是B工具可以识别的编码语言是什么,如果是UTF-8,那么编码的时候就用UTF-8。

    容易出错的mark

    1.当我们看到一个文件中有-*-coding:gbk-*-,这个只是说明这个文件的编码是什么格式的,而不代表文件里的字符串的格式,文件里定义的字符串还是这个语言本身的编码格式。

    2.在PY3中encode编码的时候不仅转了编码还把字符串变成byte,如果想变成字符串再decode一下就可以了。

     

  • 相关阅读:
    Leetcode [654] 最大二叉树 &[105] 从前序与中序遍历序列构造二叉树 & [106] 从中序与后序遍历序列构造二叉树
    Leetcode [226] 翻转二叉树 & [116] 填充每个节点的下一个右侧节点指针 & [114] 二叉树展开为链表
    Leetcode 链表&二叉树刷题总结
    Leetcode 动态规划刷题总结
    Leetcode [1312] 让字符串成为回文串的最少插入次数 动态规划
    Leetcode [234] 回文链表 回文 链表
    动态规划之 KMP 算法详解(转)
    Leetcode [99] 恢复二叉搜索树 二叉树
    统计代码行数
    二叉树遍历(递归、非递归、mirror)转
  • 原文地址:https://www.cnblogs.com/qiurp/p/13503548.html
Copyright © 2011-2022 走看看