专栏首页本立2道生python中的编码与解码

python中的编码与解码

编码与解码

首先,明确一点,计算机中存储的信息都是二进制的

编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示00110101,还是要显示'a',但计算机怎么知道00110101是'a'呢,这就需要解码,当选择用ascii解码时,当计算机读到00110101时就到对应的ascii表里一查发现是'a',就显示为'a'

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

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

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

第二行会输出u'\u4e25'

第三行输出<type 'unicode'> 严

u = s.encode('utf8')
u
print type(u),u

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

第二行输出'\xe4\xb8\xa5'

第三行输出<type 'str'> 涓

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

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

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

文件的编码格式

保存文本时也有编码格式,比如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

参考

  1. 字符编码简介 http://blog.csdn.net/trochiluses/article/details/8782019
  2. chcp http://baike.baidu.com/link?url=_qaJTLxmRJoD5pPV8ykh7om7uHqtuCquD5wqAwfrTmCMg3Ii3F3s7r11xD6rqf6ZkzH_ljz-1DwzEXyXEi2_lq
  3. python字符编码与解码 http://blog.csdn.net/trochiluses/article/details/16825269

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 网络权重初始化方法总结(下):Lecun、Xavier与He Kaiming

    书接上回,全0、常数、过大、过小的权重初始化都是不好的,那我们需要什么样的初始化?

    李拜六不开鑫
  • 卷积神经网络之卷积计算、作用与思想

    在计算机视觉领域,卷积核、滤波器通常为较小尺寸的矩阵,比如\(3\times3\)、\(5\times5\)等,数字图像是相对较大尺寸的2维(多维)矩阵(张量)...

    李拜六不开鑫
  • 伪随机数生成算法

    伪随机数生成算法在计算机科学领域应用广泛,比如枪击游戏里子弹命中扰动、数据科学里对样本进行随机采样、密码设计、仿真领域等等,背后都会用到伪随机数生成算法。

    李拜六不开鑫
  • Python3的编码问题

    ​介绍Python3中的编码问题前,第一个段落对字节、ASCII​与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。

    py3study
  • 面试题:一个HashMap对象占多少字节

    对象头结构:java对象在Heap里面的结构是这样的:对象头跟对象体,对象体跟C里面的结构体是一样的,对象头由两个域组成:用于存放hashcode、同步、GC的...

    用户1263954
  • windows校验文件时计算md5、sha1、sha256值的若干种办法

    certutil -hashfile yourfilename.ext SHA256 注意,你要说windows不区分大小写得看什么情况下,一些特定命令里大写是...

    shawyang
  • CentOs7.3 安装 JDK1.8

    下载 下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件 我在百度云盘分下的链接:http://pan.baidu.com/s/1jIFZF...

    搜云库
  • 使用默认pypi源出现连接超时的解决办法

    最近博主在做一个项目的时候,直接运行pip install django命令,出现这种情况:

    编程思录
  • android使用surfaceview+MediaPlayer播放视频

    SurfaceView从android 1.0就有了,十分好用。一般来说,UI对刷新都需要在UI线程中完成,但是,surfaceview可以在非UI线程中完成刷...

    砸漏
  • 04-STM32+ESP8266+AIR202远程升级篇-功能1-STM32自动访问升级,基于ESP8266(TCP,HTTP)(备份升级)

    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_B/" f...

    杨奉武

扫码关注云+社区

领取腾讯云代金券