您的位置:首页 > 编程语言 > Python开发

python学习笔记-番外之python中文乱码问题(python2.X)

2018-03-25 15:35 393 查看
编码简介
计算机由一个个小的电子元器件组成,而电子元器件则通过电流来控制。而电流的中断和流通只有通过开关来控制,一个普通的开关只有开和闭两种状态,人们用0和1来代表这两种状态。而通过电子元器件的巧妙组合,可以获得多位的0/1变换的状态,这样就可以像我们日常用的十进制一样建立一种二进制的表示数量的体系。而如果将这种二进制体系和特定的字符一一对应,就可以通过在电子元器件中电流的状态来传递二进制数字从而传递字符(数字,符号和英文字母)。而特定的字符所对应的二进制数字则称为编码。

相关概念
字符由字节(bytes)组成,一个字节由8个比特组成(bit),一个比特就是上面说的一个0/1位。
python2是以unicode为编码的中介的,默认编码为ASCII。encode指unicode转其他编码,decode指其他编码转unicode。

编码的发展概述
最初只有以英文为基础的称为ASCII码,(毕竟是英语系国家先在计算机方面造诣较高),但是除英文以外的语言有很多其他的特殊字符,该如何解决其他语言中的特殊字符成了一个问题。于是,各国纷纷建立包含自身语言特殊字符的本地化的编码。例如,中文就有GBK编码,一个中文字符对应2个字节(bytes)。而由于编码的版本过多,后来统一成一种新的编码,称unicode。此编码以2字节(bytes)代表一个字符。但是由于原本一个英文字母只占一个字节(bytes),这样造成存储空间的浪费。因此后来出现了一种的新的编码方法,utf-8。这种编码英文字符占一个字节(bytes),而汉字占3个字节(bytes)。

现在进入正题,乱码是因为输入和输出的编码不一致,导致输入的字符以另外一种编码的形式被识别。所以只要使输入和输出的编码一致就可以了。

输出一般称为终端。我们通过编辑器或者编译工具来调试和显示python程序和结果。
现在假设我们想让所有的编码都为utf-8,则:
1.输出不为utf-8。
你获取的数据本身已经是utf-8编码了,但是在界面上显示的是乱码。在python文件头加如下:

#!/usr/bin/python
# -*- coding: <encoding name> -*-
这种方法并没有真的改变系统的默认编码方式,只是在显示的时候按照utf-8编码的格式输出。如果你从文件或者网页读取了数据,然后再输出的话则数据本身并不是utf-8的编码格式。

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
这是修改了系统默认的编码,python以ASCII的形式编码成unicode,而这边则是改成以utf-8的形式编码成unicode

2.输入不为utf-8
一般是从网页或者文件中读取到的数据,网页或者文件本身不是utf-8编码的。一般的思路是将这种编码解码成unicode,再编码成utf-8。
s.decode("原来的编码方式").encode("utf-8")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: