zoukankan      html  css  js  c++  java
  • 了解编码,一次性处理乱码

    底部有乱码规避代码

    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

  • 相关阅读:
    系统综合实践第三次实践
    系统综合实践第二次实践作业
    第1次实践作业
    软工总结
    团队Beta演示
    团队Beta5
    软工实践个人总结
    第09组 Beta版本演示
    第09组 Beta冲刺(5/5)
    第09组 Beta冲刺(4/5)
  • 原文地址:https://www.cnblogs.com/andy9468/p/4253761.html
Copyright © 2011-2022 走看看