Python编码详解

栏目: 编程语言 · Python · 发布时间: 7年前

内容简介:Python编码详解

字符串编码简介

  1. 计算机只能处理数字,文本转换为数字才能处理。计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255

  2. 计算机是美国人发明的,所以一个字节可以表示所有字符了,所以ASCII(一个字节)编码就成为美国人的标准编码

  3. 但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国制了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题就都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码

  4. 于是unicode出现了,将所有语言统一到一套编码里

  5. 看一下ASCI和unicode编码:

  • 字母A 用ASCI编码十进制是65,二进制0100 0001
  • 汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013 二进制是01001110 00101101
  • A用unicode编码只需要前面补0二进制是00000000 0100 0001
  1. 乱码问题解决了,但是如果内容全是英文,unicode编码比ASCI需要多 一倍的存储空间,同时如果传输需要多一倍的传输。

  2. 所以出现了可变长的编码“utf-8”,把英文变长一个字节,汉字3个字节。特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显了

一、windows下环境演示

C:\Users\zhangyy49>python
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> test_str = "abc"
>>> test_unicode = u"abc"
>>> test_str.encode("utf8")
'abc'
>>> test_unicode.encode("utf8")
'abc'
>>> test_str2 = "中文"
>>> test_unicode2 = u"中文"
# python字符串在内存中是用unicode编码的
>>> test_str2.encode("utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd6 in position 0: ordinal not in range(128)
>>> test_unicode2.encode("utf8")
'\xe4\xb8\xad\xe6\x96\x87'
# decode作用是为了让其它编码格式转变为unicode编码,windows下test_str2编码是gb2312
>>> test_str2.decode("gb2312").encode("utf8")
'\xe4\xb8\xad\xe6\x96\x87'
>>>

二、 linux 下环境演示

[root@slave2 ~]# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> test_str = "中文"
# linux下默认test_str的编码是utf8编码
>>> test_str.decode("utf8").encode("utf8")
'\xe4\xb8\xad\xe6\x96\x87'
>>> test_str.encode("utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> import sys
>>> sys.getdefaultencoding()
'ascii'

encode必须保证前面是unicode字符串,如果直接对字符串test_str直接encode的话,会先调用默认的编码进行decode,而默认的编码的是ascii,对中文转换成ascii会报错,所以就会出现如上错误


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Qt 5.9 C++开发指南

Qt 5.9 C++开发指南

王维波、栗宝鹃、侯春望 / 人民邮电出版社 / 2018-5-1 / 89.00元

本书以Qt 5.9 LTS版本为开发平台,详细介绍了Qt C++开发应用程序的技术,包括Qt应用程序的基本架构、信号与槽工作机制、图形显示的Graphics/View架构、数据编辑和显示的Model/View架构、对话框和多窗口的设计与调用方法等,介绍了常用界面组件、文件读写、绘图、图表、数据可视化、数据库、多线程、网络和多媒体等模块的使用。每个编程主题都精心设计了完整的实例程序。 通过阅读......一起来看看 《Qt 5.9 C++开发指南》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具