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

  • 相关阅读:
    windows系统切换jdk,修改java_home无效情况
    Cannot instantiate interface org.springframework.context.ApplicationListener
    MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
    ASP.NET Web API 使用Swagger生成在线帮助测试文档,支持多个GET
    EF TO MYSQL 无法查询中文的解决方法
    HttpWebRequest post请求获取webservice void数据信息
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分 解决方案
    MySQL 5.7.13解压版安装记录 mysql无法启动教程
    C# udpclient 发送数据断网后自动连接的方法
    汽车XX网站秒杀抢购代码
  • 原文地址:https://www.cnblogs.com/andy9468/p/4253761.html
Copyright © 2011-2022 走看看