zoukankan      html  css  js  c++  java
  • 编码与解码

    编码:真实字符与二进制串的对应关系,真实字符→二进制串

    解码:二进制串与真实字符的对应关系,二进制串→真实字符
     
    首先,明确一点,计算机中存储的信息都是二进制的
    编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示00110101,还是要显示'a',但计算机怎么知道00110101是'a'呢,这就需要解码,当选择用ascii解码时,当计算机读到00110101时就到对应的ascii表里一查发现是'a',就显示为'a'
     
    常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

    ASCII & UTF-8

    大家熟知的ASCII以1字节8个bit位表示一个字符,首位全是0,表示的字符集明显不够
    unicode编码系统是为表达任意语言而设计的,为了防止存储上的冗余(比如,对应ascii码的部分),其采用了变长编码,但变长编码给解码带来了困难,无法判断是几个字节表示一个字符
    UTF-8是针对unicode变长编码设计的一种前缀吗,根据前缀可判断是几个字节表示一个字符
    如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
    比如"严"的unicode是4E25(100111000100101),4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,高位补0,得到"严"的UTF-8编码是"11100100 10111000 10100101"。

    python中的解码和编码

    在python中,编码解码其实是不同编码系统间的转换,默认情况下,转换目标是Unicode,即编码unicode→str,解码str→unicode,其中str指的是字节流
    而str.decode是将字节流str按给定的解码方式解码,并转换成utf-8形式,u.encode是将unicode类按给定的编码方式转换成字节流str
    注意调用encode方法的是unicode对象生成的是字节流,调用decode方法的是str对象(字节流)生成的是unicode对象,若str对象调用encode会默认先按系统默认编码方式decode成unicode对象再encode,忽视了中间默认的decode往往导致报错
    自己写代码时只需记住str字节流调用decode,unicode对象调用
    s = u''
    s
    print type(s), s

    第一行定义了一个unicode对象(不是utf8)

    第二行会输出u'u4e25'
    第三行输出<type 'unicode'> 严
    u = s.encode('utf8')
    u
    print type(u),u

    倘若这时我用s.encode('utf8'),则将s使用utf-8编码并将编码结果保存为字节流

    第二行输出'xe4xb8xa5'
    第三行输出<type 'str'> 涓
    还有要注意的是,终端默认的编码格式是gbk,windows cmd中可以通过chcp查看以及改变,也可以到注册表修改终端默认编码(HKEY_CURRENT_USER console或者powershell下的codepage),936为简体中文,65001为utf8,两者都可显示中文,但为了方便中文输入,我将其默认设为936

    当调用print函数将内容格式化输出到终端时,会将unicode对象转换为终端的编码方式输出,如上面第一次print的结果是正常的,print utf8字节流时,终端按其默认gbk解码显示时就会出问题,这里恰巧'xe4xb8'为gbk下的“涓”

    = s.encode('utf8').decode('utf8')

    t
    第二行会输出u'u4e25'

    文件的编码格式

    保存文本时也有编码格式,比如txt文件保存可选择则ASCII、utf8等,对py文件可在前两行注明编码方式# -*- coding: UTF-8 -*-
    在python中读取文件
    fr = open('encode.py','r')
    fstr = fr.read()

    只要记住fstr是字节流,其他的操作参看上面即可

    注:以上操作均在cmd或powershell下完成,在python自带的解释器下会有问题,s=u'你好',然后s,显示的虽然是unicode对象,但是编码却是gbk的而不是unicode

  • 相关阅读:
    Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”
    《Kafka权威指南》读书笔记-操作系统调优篇
    HTML&CSS基础-表单简介
    《Apache Kafka 实战》读书笔记-认识Apache Kafka
    HTML&CSS基础-完善clearfix
    HTML&CSS基础-使用表格布局
    比Kafka Mangaer更优秀的开源监控工具-Kafka Eagle
    Kafka吞吐量测试案例
    flume常见异常汇总以及解决方案
    运维监控-Open-Falcon单机部署实战篇
  • 原文地址:https://www.cnblogs.com/lishanyang/p/7347657.html
Copyright © 2011-2022 走看看