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文件头加如下:
2.输入不为utf-8
一般是从网页或者文件中读取到的数据,网页或者文件本身不是utf-8编码的。一般的思路是将这种编码解码成unicode,再编码成utf-8。
s.decode("原来的编码方式").encode("utf-8")
计算机由一个个小的电子元器件组成,而电子元器件则通过电流来控制。而电流的中断和流通只有通过开关来控制,一个普通的开关只有开和闭两种状态,人们用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")
相关文章推荐
- Android(java)学习笔记212:中文乱码的问题处理(qq登录案例)
- Androin学习笔记三十九:Android 中文乱码问题
- 【Python学习笔记】出现乱码问题之解决方案汇总
- struts2学习笔记----------struts2.1.6接收中文请求参数乱码问题
- [学习笔记]Servlet 中文乱码问题及解决方案剖析
- Python学习笔记:中文编码问题
- 【MySQL学习笔记】4:解决JDBC连接MySQL的query结果中文乱码问题
- Servlet学习笔记—request获得参数中文乱码问题解决
- Java Web 学习笔记之六 DataOutputStream方法writeBytes(String s)方法中文乱码问题
- SprintBoot学习笔记(5):解决中文乱码问题
- Mysql DBA 高级运维学习笔记-Mysql插入中文乱码问题
- Python学习笔记(二)-NotePad++中文显示问题
- 【2015/4/25】JSP学习笔记4---JSP的ession+中文乱码问题
- Struts2 学习笔记 —— 10 —— Action接收参数时的中文乱码问题
- JSP学习笔记(6)_中文乱码问题
- Python入门--番外--中文目录乱码问题
- 学习笔记--SpringMVC 3.1下返回json时中文显示乱码问题的解决方案
- node.js 学习笔记(一) 解决node里中文乱码问题
- 学习笔记:处理表单提交的中文乱码问题
- Java学习笔记37:Spring 使用 @ResponseBody 返回中文乱码问题解决