-
无论是全球哪种文字,只需要保存文件的时候,保存成UNICODE编码就可以被其他电脑正常解释。
-
UTF-8等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK等编码也可以。
各个字符编码特征
“字节”是一个8位的物理存贮单元,而“字符”则是一个文化相关的符号。
-
Ascii
(American Standard Code for Information Interchange,美国信息互换标准代码)
- 1个字节
字符值 | 0 | A | a |
---|---|---|---|
十进制 | 48 | 65 | 97 |
-
GBK
(Guo Biao Kuozhan 国标扩展(码))
- 两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里
-
Unicode
(Universal Multiple-Octet Coded Character Set,简称UCS, 俗称unicode),严格来说unicode属于字符集,而不是编码,编码用utf
- 分为UCS-2(标准的2字节形式),UCS-4(4字节形式)
-
\u
开头是unicode
-
utf-8
(UCS Transfer Format -8)
- 一种变长的编码方式,可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
- 当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,
- UTF-8一个中文字符占3个字节。
- 从unicode到utf-8并不是直接的对应,而是要过一些算法和规则来转换。
- 因为utf-8编码的字符串长度和字符个数没有固定换算关系,导致排版,排序之类的复杂度上升。所以用unicode存储。
- utf以
\x
开头
字符编码发展过程
这里只介绍常见的 ,非时间顺序
-
计算机能够处理二进制数据,早期人们决定用8个可以开合的晶体管来组合成不同的状态,称为“字节”,美国制定Ascii来保存英文文字
- 把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号。
-
127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称“扩展字符集”。
-
但是中国汉字太多,经过在GB2312编码一系列扩展后形成GBK标准的编码方案
- 把汉字、数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符了
-
由于像GBK一样各个国家都有自己的编码标准,为了统一,国际标准化组织ISO重新搞一个包括了地球上所有文化、所有字母和符号的编码unicode
- 直接规定必须用两个字节
-
对于ASCII里的那些“半角”字符,unicode保持其原编码不变,只是将其长度由原来的8位扩展为16位,其高8位永远是0,浪费空间
-
为解决unicode如何在网络上传输的问题,于是面向传输的众多UTF标准出现了,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位
Base64
用途
-
严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串(Ascii)表示出来,以便复制粘贴
-
如果在网络上直接传输二进制,比如图片,或者字符,需要用4/3倍带宽传输数据的Base64究竟有什么意义?
-
真正的原因是二进制不兼容。某些二进制值,在一些硬件上,比如在不同的路由器,老电脑上,表示的意义不一样,做的处理也不一样。同样,一些老的软件,网络协议也有类似的问题。
-
但是万幸,Base64使用的64个字符,经ASCII/UTF-8编码后在大多数机器,软件上的行为是一样的。Base64能够将任何数据转换为易移植的字符串,避免了传输过程中失真问题
-
特征
- Base64编码是从二进制值到某些特定字符(英文大小写、数字和+、/以及用作后缀等号)的编码,这些特定字符一共64个,所以称作Base64。
- base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号)
- 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;
URL编码
规则
目前比较常见的就是把字符转化为utf-8的十六进制,每个字节用%
开头
Refer:
[1]Unicode 和 UTF-8 有什么区别? - 盛世唐朝的回答 - 知乎
[2]为什么要使用base64编码,有哪些情景需求? - wuxinliulei的回答 - 知乎
[3]密码学 | Base64是加密算法吗? - 彭旭锐的文章 - 知乎
[4]计算机中为何不直接使用 UTF-8 编码进行存储而要使用 Unicode 再转换成 UTF-8 ? - Ivony的回答 - 知乎
[5]程序员必备:彻底弄懂常见的7种中文字符编码 - 腾讯的文章 - 知乎
[6]为什么要使用base64编码,有哪些情景需求? - Wang Kai的回答 - 知乎
[7]为什么要使用base64编码,有哪些情景需求? - wuxinliulei的回答 - 知乎
[8]如何用通俗易懂的语言解释base64? - 刘巍然-学酥的回答 - 知乎