日志

字符集其实很简单

 来源    2020-09-16    0  

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

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

并且记得足够牢足够久。

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

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

版权申明:本文为博主原创文章,转载请保留原文链接及作者。
如果您喜欢我写的文章,请关注公众号支持一下,谢谢哈哈哈。

相关文章
WPF MVVM:命令很简单 如何连接View和ViewModel与RoutedEvent
问答假设我有一个在资源字典中作为DataTempate实现的视图. 而且我有一个相应的ViewModel. 绑定命令很简单.但是如果我的视图包含一个控件,例如ListBox,而且我需要根据列表中更改的项目 ...
1
windows – 如何跟踪WinRT应用程序(在Win32中很简单)?
问答在"旧"时代,我为Windows用户创建了一个简单的工具,它跟踪他们在计算机前面所做的事情(简单的活动监视器).我正在使用Win32 api和GetForegroundWindow ...
1
c++ v4l2很简单的例子
问答我正在寻找使用V4L2的Linux中的摄像机访问的简单示例. 在哪里可以找到它?尽可能简单. 谢谢,::尝试这里的uvccapture代码 – > http://staticwave.ca/so ...
1
ruby-on-rails – 任何人都可以提出一个很好但很简单的Open Source Rails项目,其中包含许多待定功能吗?
问答任何人都可以建议我一个很好的RoR开源项目,涵盖了很多Rails的基础知识但是很简单,最重要的是有很多功能或至少还有一些尚未实现的bug修复?我检查了一些像Spree,Substruct等,但不能归零 ...
3
断言不能在php中工作.很简单.我究竟做错了什么?
问答这就像断言甚至没有被调用.我很迷惑. 版本 :~/code/x/test$php -v PHP 7.0.11-1+deb.sury.org~xenial+1 (cli) ( NTS ) Copyrig ...
1
在OpenCV 2.3中为Mat数组赋值的问题 – 似乎很简单
问答使用OpenCV 2.3的新API,我无法将值分配给循环内的Mat数组(或说图像).这是我正在使用的代码片段; int paddedHeight = 256 + 2*padSize; int padd ...
1
c# – .NET对象最灵活的序列化是什么,但实现起来很简单?
问答我想序列化和反序列化对象,而不必担心整个类图. 灵活性是关键.我想能够序列化任何传递给我的对象,而不需要整个对象图形所需的完整属性. That means that Binary Serializat ...
2
ruby-on-rails – postgres_ext / serializers help …看起来很简单,但无法按照描述获得任何工作
问答https://github.com/dockyard/postgres_ext-serializers 这似乎很容易设置,但我似乎无法获得任何基本功能来将JSON从rails移动到postgres. ...
2
python – 为内存高效的元组列表实现struct的结构很简单
问答我需要创建以下类型的列表 [(latitude, longitude, date), ...] 纬度和经度是浮点数,日期是整数.我的本地机器上的内存不足,因为我需要存储大约6000万个这些元组.什么是 ...
1
为什么C#不能推断类型从这个看起来很简单,明显的情况
问答给定这个代码: class C { C() { Test<string>(A); // fine Test((string a) => {}); // fine Test((Acti ...
1
python – 在django中有一个用户的组名称很简单
问答我在django.contrib.auth.User和django.contrib.auth.Group的帮助下尝试了以下代码 for g in request.user.groups: l.appe ...
java – Android Apk反编译似乎很简单
问答我只是在乱七八糟我下载了dex2jar http://code.google.com/p/dex2jar/和Java Decompiler JD-GUI http://java.decompiler. ...
1
iphone – 真的很简单的CoreData关系,但返回nil和null?
问答这个bug已经在过去4个小时内破坏了我. 此外,当我交换它,首先获取用户数据,然后消息数据- User.name将显示,但Message.message不会.所以数据肯定会进行,但是它们之间的关系似乎 ...
2
http – 多个response.WriteHeader调用真的很简单的例子?
问答我有最基本的net / http程序,我用来学习Go中的命名空间: package main import ( "fmt" "log" "net/ht ...
1
c# – 无法解析XML字符串.应该很简单
问答我正在尝试使用.net将字符串解析为XElement.我每次都收到此错误,无法解决原因- "根级别的数据无效.第1行,第1位." 我试过HTMLEncode但它没有帮助.我也在Li ...
1
c# – 在WPF中刷新ListBox的方法很简单?
问答我创建了一个简单的表单,插入/更新/删除Northwind客户的值. 一切正常,除了为了看到结果,我必须关闭它,然后重新打开. 我的表单看起来像这样: 我已经搜索了数十篇关于如何刷新ListBox的文 ...
1
java – 很简单的一步一步JBehave设置教程?
问答虽然我已经阅读了很多,但是很多关于如何使用JBehave的文章,我不能让它工作.以下是我到目前为止的步骤: >创建新的Java项目 >下载JBehave JAR文件3.6.8并将其添加到我 ...
1
很简单的渐进图片模块 – progressive-image
日志progressive-image 一个很简单的渐进图片模块,应用于Vanilla JavaScript 和Vue.js 1.0+ & 2.0+ 安装 $ npm install progre ...
1
php – 在不同的网页之间分发表单元素,看起来很简单但无法修复
问答这个问题类似于我之前的问题,但不一样--请查看-.我正在使用totaly 3个网页;表单元素分布在两个页面"eg1.html"和"eg2.html"中,但所有表 ...
1
正则表达匹配,很简单:
问答我希望将Twitter语法与正则表达式相匹配. 我如何匹配任何"@______",即以@符号开头,后面没有空格,只有字母和数字,直到单词的结尾? (对于推特,我想在回复中匹配某人的 ...