专栏首页dongfanger字符集其实很简单

字符集其实很简单

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

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

并且记得足够牢足够久。

工作中遇到的“词汇”,主要是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。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 接口自动化项目实践

    最初的方案是每个接口返回flag不一样,在每个接口返回后,在用例中通过将flag和响应,传参给封装函数做判断。

    dongfanger
  • 我倒在了美团面试算法题:字符串大数相加

    对这个算法,首先要考虑的是,怎么来遍历这 2 个数,可以用 2 个指针,分别指向这 2 个数的尾部,边计算边向左移动。

    dongfanger
  • Go测试开发(一) 怎么写Go代码

    以及如何fetch,build和install Go的modules,packages,commands。

    dongfanger
  • 中文URL编码

    用户1258909
  • Python爬取YY评级分数并保存数据实现过程解析

    当需要进行大规模查询时(比如目前遇到的情形:查询某个省所有发债企业的YY评级分数),人工查询显然太过费时,那就写个爬虫吧。

    砸漏
  • QAPM新内存分析"专家",帮你分析内存问题根因

    QAPM原有Hprof分析是基于开源项目LeakCanary的shark Andoroid Extension,这里仅有针对安卓内存泄露部分,同时包含了一个极其...

    QAPM腾讯客户端性能分析
  • 《从案例中学习JavaScript》之酷炫音乐播放器(二)

    剽悍一小兔
  • AI人才报告:美国从业人员是中国2倍,供给方面中国仍落后

    导读:近日,清华大学社科学院社会学系副教授何晓斌在“创新,无界——中国AI创新者论坛”上。做了《AI背景下的文科人才培养》主题报告。

    华章科技
  • 吴恩达最近比较神秘,但他的老师MJ刚宣布了加盟蚂蚁金服

    大数据文摘
  • 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式

    浮雕模型,简单地说就是在木板上刻字时所形成的效果,如果把字的部分都剔除掉,就得到一个凹浮雕模型,如果把字以外的部分都剔除掉,就得到一个凸浮雕模型。本文分别对利用...

    大史不说话

扫码关注云+社区

领取腾讯云代金券