zoukankan      html  css  js  c++  java
  • 字符集其实很简单

    字符集其实是个很简单的东西,但很多人当时看懂了,过了就忘了。

    本篇文章的目的就是,不一定要把字符集的知识讲的有多深,但是一定要在工作上够用。

    并且记得足够牢足够久。

    工作中遇到的“词汇”,主要是ASCII、GB2312、GBK、Unicode、UTF-8,还有URL Encode、URL Escape。

    编码和解码

    编码,encode。

    解码,decode。

    编码,编成计算机能懂的码,二进制。

    解码,解成人类能读懂的码,人语言。

    想让计算机懂,你得编它。

    想让人类能懂,你得解释。

    字符代码和字符编码

    字符代码就是序号,比如65。

    字符编码二进制序列,比如01000001。

    由于基本相同,所以我们平时就忽略了差异。

    差异体现在哪呢?UTF-8

    字符集发展历史

    美国,英文字母、标点符号字符、阿拉伯数字,ASCII

    欧洲,加入带重音的字符、希腊字母等,Latin-1

    中国!加入汉字! GB2312

    加入生僻字、繁体字及日韩汉字等,GBK

    各说各的,乱码

    ISO国际标准化组织一统江湖,Unicode

    再编码,UTF-8

    因为Unicode需要遵循统一的存储,就造成了资源浪费,比如汉字和英文,占用的空间是不一样了。

    为了支持这种差异,节约存储,高效传输,对Unicode进行了再编码,也就是UTF-8,也是用的最广泛的字符集之一。

    URL Encode和URL Escape

    Web服务器只允许URL中包含ASCII

    那怎么办?只有先encode成二进制,让服务器自己decode咯。

    所以URL Encode后是“百分号+2位十六进制”的形式,比如%20。

    需要Encode的包括

    • 非ASCII字符
    • ASCII控制字符,因为不可打印
    • 保留字符,如&,因为URL自身是用&分隔的,参数内容包括&的话就要Encode
    • 不安全字符,如空格,可能造成歧义

    用Python来实际看看

    from urllib.parse import urlencode
    
    x = urlencode({"a": 1, "b": "a", "c": "汉", "d": " ", "e": "&"})
    print(x)  # a=1&b=a&c=%E6%B1%89&d=+&e=%26
    

    URL Escape,也就是URL转义,碰到最多的就是把<>&转成&lt;&gt;&amp;

    Python html.escape函数,一切尽在代码中

    def escape(s, quote=True):
        """
        Replace special characters "&", "<" and ">" to HTML-safe sequences.
        If the optional flag quote is true (the default), the quotation mark
        characters, both double quote (") and single quote (') characters are also
        translated.
        """
        s = s.replace("&", "&amp;") # Must be done first!
        s = s.replace("<", "&lt;")
        s = s.replace(">", "&gt;")
        if quote:
            s = s.replace('"', "&quot;")
            s = s.replace('\'', "&#x27;")
        return s
    

    有时候还会碰到被转成了\u003e\u003c\u0026,这是JSON序列化搞出来的Unicode。

    简要回顾

    本文首先讲了怎么记忆编码和解码,然后通过字符代码和字符编码的差异,引出了如今常用的UTF-8,接着从发展历史来看,字符集是怎么发展到现在的。最后解释了Web URL中容易混淆的2个概念,URL Encode和URL Escape。

    当然,如果过了不久还是忘了,那么只有把这篇文章翻出来再看一遍了(手动滑稽)。


    所有文章公众号【测试开发刚哥】首发!

    版权申明:本文为博主原创文章,转载请保留原文链接及作者。
  • 相关阅读:
    判断开始时间不能小于结束时间
    angular1.0使用echarts点刷新再次调用echarts方法
    解决angular4.0打包后不能再继续打包
    html拼接+layer按钮
    angular.js+echarts
    nginx配置
    NET_Framework_4.0installer.rar
    IIS6.0开启gzip压缩
    IIS的应用程序池优化方法
    远程桌面连接电脑后键盘失灵解决
  • 原文地址:https://www.cnblogs.com/df888/p/13681133.html
Copyright © 2011-2022 走看看