了解编码,一次性处理乱码

底部有乱码规避代码

1.字符集、字符编码

动作:编码、解码

编码(encode):计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";

解码(decode):反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。

状态:编码表(字符集、数字代码)

编码表:编码和解码之间的正确映射关系,成为编码表。编码表包括字符集数字代码(即序号)。

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

因此,在显示器上看见的文字、图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片。
假设,你用显微镜把盘片放大,会看见盘片表面凹凸不平,凸起的地方被磁化,凹的地方是没有被磁化;凸起的地方代表数字1,凹的地方代表数字0。硬盘只能用0和1来表示所有文字、图片等信息。
那么字母”A”在硬盘上是如何存储的呢?可能小张计算机存储字母”A”是1100001,而小王存储字母”A”是11000010,这样双方交换信息时就会误解。
比如小张把1100001发送给小王,小王并不认为1100001是字母”A”,可能认为这是字母”X”,于是小王在用记事本访问存储在硬盘上的1100001时,在屏幕上显示的就是字母”X”。
也就是说,小张和小王使用了不同的编码表。小张用的编码表是ASCII,ASCII编码表把26个字母都一一的对应到2进制1和0上;小王用的编码表可能是EBCDIC,只不过EBCDIC编码与ASCII编码中的字母和01的对应关系不同。
一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统(MVS 、OS/390等)采用EBCDIC 编码。在发送数据给对方前,需要事先告知对方自己所使用的编码,或者通过转码,使不同编码方案的两个系统可沟通自如。

2.常用字符集和字符编码
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

3.网页方面的编码应用:

首先,各位得对一次 请求/响应 的流程有基本认识,即:浏览器发出请求--》服务器接收并处理请求--》将html形式的页面返回(响应)给浏览器,一次 请求/响应 完毕!
(1)静态页面(html):
保存文件时的编码选项(默认为ANSI,中文操作系统ANSI即为GBK)必须得与html页面中的content-Type(即在meta标签中配置的http-equiv="content-Type")中的配置的码一致,访问此页面时才不会出现乱码。(若不显示定义meta标签,则默认是meta标签中给出的是系统ANSI编码,中文操作系统是GBK)
<meta http-equiv="content-Type" content="text/html;charset=字符编码">
解释:web服务器接收到静态请求后(如对html页面的请求),web服务器仅仅是从目录结构中搜索到它,并将它以流的形式返回,而它的编码类型在保存文件时已经确定了,而上面的meta标签就是告诉浏览器以何种字符编码去解码,所以保存文件时的编码选项必须得与html页面中的content- Type中的配置的字符编码一致。
Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; charset='gb2312'

(2)动态页面(jsp为例)

<%@page contentType="text/html;charset=字符编码" pageEncoding="字符编码"%> 

解释:web容器会根据pageEncoding中的编码将jsp页面转换成servlet文件(若没有pageEncoding属性,则使用 contentType中的编码将jsp文件转换成servlet),其原理也就是以流的形式读jsp文件,所以保存jsp文件时的编码选项必须与 pageEncoding属性中配置的字符编码一致(或者在没有pageEncoding属性时与contenType属性中配置的编码一致)。而在 servlet中生成html文件时使用的是contentType中配置的编码将html页面以流的形式输出(若没有设置contentType中的charset则使用的是pageEncoding,此时,与之前不同,它们的优先级是contentType>pageEncoding),浏览器也会以contentType中的编码(或pageEncoding)来解码(之所以这么说是因为浏览器根据响应头来解码,而他们恰恰改变的是响应头)。所以contentType中的编码可以与jsp文件保存时的编码选项不同(因为在有pageEncoding属性的情况下,他们之间没有直接联系,但若没有pageEncoding属性则另当别论,原因上面已经说过)!

4、常见编码举例

https://www.cnblogs.com/andy9468/p/7465489.html

ASCII、ANSI(包括ASCII、GBK、big5等)、Unicode(包括utf-8、utf-16、utf-32)

延伸:base64编码

可以理解成:utf8是文字编码,而base64是数据编码。

BASE64是一种编码方式,通常用于把二进制数据编码为可写的字符形式的数据。这是一种可逆的编码方式。
编码后的数据是一个字符串,其中包含的字符为:A-Z、a-z、0-9、+、/
共64个字符:26 + 26 + 10 + 1 + 1 = 64。
【注:其实是65个字符,“=”是填充字符】。

参考:https://jingyan.baidu.com/article/6b97984db1ba9b1ca2b0bfeb.html

5、解决py2和py3的乱码问题

https://blog.csdn.net/qq_39112646/article/details/86769151 

强烈推荐的兼容写法:兼容py2和py3

# -*- coding:utf-8 -*-
import sys
if sys.version_info < (3, 0):
    # 设置python2的编码格式为utf-8
    reload(sys)
    sys.setdefaultencoding('utf8')

  

对应python2乱码问题(不兼容python3,不推荐):py文件开头写以下内容,一次性解决py2的中文乱码问题

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')

  

6.详细参考
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

http://jkhandsome12-163-com.iteye.com/blog/750469

http://www.cnblogs.com/kex1n/p/4138427.html

原文地址:https://www.cnblogs.com/andy9468/p/4253761.html