「python」ghost 编码问题-阿里云开发者社区

开发者社区> 王__12> 正文

「python」ghost 编码问题

简介: 编码问题总结
+关注继续查看

ghost

参考

Alex-金角大王在知乎上关于python编码的回答,链接:https://www.zhihu.com/question/31833164/answer/381137073

这一篇总结的标题之所以是「ghost」鬼魂,是因为这个问题就像「ghost」一样,随时会出现在我的代码,我的程序中,时不时会冒出来,然后需要解决。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence"

首先编码有很多种例如:

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码

虽然每个国家都有自己的编码,但是这种编码会有局限性!!!!就是无法对应其他国家的字符。

Unicode编码出现,Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...

Unicode 起到了2个作用:

  • 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
  • unicode包含了跟全球所有国家编码的映射关系(这个很关键,就如unicode 知道gbk 编码是0100101010对应unicode 里面的啥编码)

虽然Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间!!!!例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。

为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!

UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32: 使用4个字节表示所有字符;

总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

字符在硬盘上的存储

无论以什么编码在内存里显示字符,存到硬盘上都是2进制。

ascii编码(美国):
    l   0b1101100
    o   0b1101111
    v   0b1110110
    e   0b1100101
GBK编码(中国):
    老   0b11000000 0b11001111
    男   0b11000100 0b11010000
    孩   0b10111010 0b10100010

Shift_JIS编码(日本):
    私   0b10001110 0b10000100
    は   0b10000010 0b11001101

ks_c_5601-1987编码(韩国):
    나   0b10110011 0b10101010
    는   0b10110100 0b11000010

TIS-620编码(泰国):
    ฉัน  0b10101001 0b11010001 0b10111001
要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读

编码的转换

请问:中国的电脑上有一个文件用的GBK 编码,而不是UTF-8,要放在歪果仁的电脑上(没有GBK编码)怎么办?
两个对策:

  • 让歪果仁的电脑上都装上gbk编码
  • 把你的文件编码转成以utf-8编码
    反正这两种办法都很费劲

unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,意思就是,你写的是gbk的“路飞学城”,但是unicode能自动知道它在unicode中的“路飞学城”的编码是什么

Python3的执行过程

python3 执行代码的过程

  • 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
  • 把代码字符串按照语法规则进行解释,
  • 所有的变量字符都会以unicode编码声明

UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8

  • decode示例
#在python2中
#_*_coding:utf-8_*_
s = '路飞学城'
print s
s2 = s.decode('utf-8')
print s2
print type(s2)

输出:

乱码 
路飞学城
unicode
  • encode 示例
# 在python2中
#_*_coding:utf-8_*_
s = '路飞学城'
print s
s2 = s.decode('utf-8')
s3 = s2.encode('GBK')
print s3
print type(s3)

输出:

乱码 
路飞学城
str

所以

  • utf-8可以 decode 解码成unicode
  • unicode 也可以 encode 编码成 gbk

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
boost.xml_parser中文字符问题
当使用xml_parser进行读xml时,如果遇到中文字符会出现解析错误。 网上有解决方案说使用wptree来实现,但当使用wptree来写xml时也会出错。而使用ptree来写中文时不会出错。   综合以上信息,尝试使用ptree来写xml,而用wptree来读。
1115 0
编码问题
字节流(二进制流) 首先明确“字节(Byte)”和“字符(Character)”的大小: 1 byte = 8 bit 1 char = 2 byte = 16 bit (Java默认UTF-16编码) 字节流是由字节组成的,字符流是由字符组成的.
586 0
mysql之字符编码问题
问题描述:新建数据库并新建表插入数据,中文乱码问题,即便将字符集通过命令行或者mysql客户端改为utf-8还是乱码。 问题原因:此问题目前主要出现在Linux为centos7安装mysql上,主要是通过源码编译安装mysql。
801 0
Python中的编码错误问题
设置python运行环境的编码参考这里   http://diveintopython.org/xml_processing/unicode.html 《Dive Into Python》 的 Example 9.
602 0
DNN使用非80端口和总是跳转到http://localhost问题的解决(翻译)
我试图在一台服务器上安装一个DNN网站时,遇到了一些问题。问题一: 遇到的第一个问题就是网站总是自动导向到localhost。不管我怎么试,只要我输入http://domain.com/dnn,总是自动导向http://localhost/dnn,这样会导致外部无法访问这个网站。
555 0
python 编码
字符编码 中文: >>> name = '你好' >>> name '\xe4\xbd\xa0\xe5\xa5\xbd' 英文: >>> name = "hiekay" >>> name 'hiekay' 计算机中的字符编码 一般用utf-8 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。
791 0
使用xshell连接服务器问题:ssh_exchange_identification: Connection closed by remote host
在连接服务器的时候遇到了如下的问题: 在网上查找方法: 1、让/etc/hosts.allow 和/etc/hosts.
1233 0
+关注
王__12
记录生活与学习的过程
14
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载