常见字符编码方式及Base64,url

  • 无论是全球哪种文字,只需要保存文件的时候,保存成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? - 刘巍然-学酥的回答 - 知乎

posted @ 2021-12-15 13:20  Doonnie  阅读(769)  评论(0编辑  收藏  举报