字符集其实很简单
字符集其实是个很简单的东西,但很多人当时看懂了,过了就忘了。
本篇文章的目的就是,不一定要把字符集的知识讲的有多深,但是一定要在工作上够用。
并且记得足够牢足够久。
工作中遇到的“词汇”,主要是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转义,碰到最多的就是把<
、>
、&
转成<
、>
、&
。
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("&", "&") # Must be done first!
s = s.replace("<", "<")
s = s.replace(">", ">")
if quote:
s = s.replace('"', """)
s = s.replace(''', "'")
return s
有时候还会碰到被转成了u003e
、u003c
、u0026
,这是JSON序列化搞出来的Unicode。
简要回顾
本文首先讲了怎么记忆编码和解码,然后通过字符代码和字符编码的差异,引出了如今常用的UTF-8,接着从发展历史来看,字符集是怎么发展到现在的。最后解释了Web URL中容易混淆的2个概念,URL Encode和URL Escape。
当然,如果过了不久还是忘了,那么只有把这篇文章翻出来再看一遍了(手动滑稽)。
- TensorFlow 深度学习笔记 逻辑回归 实践篇
- 黑客是如何实施暴力破解的?
- Python的初学者你现在可以自己“看”到代码的运行了!
- ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
- TensorFlow 深度学习笔记 从线性分类器到深度神经网络
- 微信版12306来了!用12306微信小程序买票靠谱吗
- 无需写try/catch,也能正常处理异常
- “人工智能毁灭人类”是一种末世恐惧传染病
- 有状态(Stateful)应用的容器化
- 实现一些字符串操作标准库函数、解决一些字符串问题
- 外卖陷阱,你入坑了么?
- ASP.NET Core的配置(4):多样性的配置来源[上篇]
- 37 个你必须知道的现代数据中心术语
- Python读书笔记7
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 科研SCI论文图片基础知识详解
- vue3.0的异步更新原理
- 小白学PyTorch | 10 pytorch常见运算详解
- vuex的基础知识点
- 小白学PyTorch | 11 MobileNet详解及PyTorch实现
- 小白学PyTorch | 12 SENet详解及PyTorch实现
- 重拾前端技能为你的职业前程保驾护航
- input切换显示与隐藏,歘~
- 小白学PyTorch | 13 EfficientNet详解及PyTorch实现
- Java 比较两个字符串内容是否相等
- 前端模块化发展史
- 前端性能优化
- 突击并发编程JUC系列-原子更新AtomicLong
- Windows下指定的服务已经标记为删除”
- 《剑指offer》第29天:m x n 网格的最小路径和