美文网首页
All about encode & decode

All about encode & decode

作者: 小丸子啦啦啦呀 | 来源:发表于2022-05-22 16:21 被阅读0次

    我对编码解码的认识来源于两组js的内置API:

    • encodeURI & encodeURI
    • encodeURIComponent & decodeURIComponent

    一直以来,我认为encode/decode就是为了“转义(escape)”,比如, 如果我需要在query string中加入一些保留关键字如?,#, &时,如果不做encode那么就会导致错误。

    但是,我还没有真正遇到过因为没有做encode而造成的bug. 所以,其实我一直很疑惑为什么要编码解码?

    why we encode/decode?

    通过读这篇文章(https://www.urlencoder.io/learn/#url-encoding-percent-encoding),我了解到我一直以来的认知倒也没错。URL只能包含ASCII中的有限字符,不能包含特殊字符比如!@,以及保留字符(也就是对于URL本身有特殊含义的比如/#?:),这是约定俗成。如果不遵照规范,可能会出现bug。

    既然如此,为什么不让浏览器自己转?
    我发现网浏览器地址栏输空格再回车,确实会帮忙自动转成%20。所以设计这两个API,可能是因为URL不仅流通在浏览器地址栏,还可能流通在代码中,比如可能将要用XHR直接在代码中发出网络请求。

    那么,encode 和 decode 到底怎么工作的?跟ASCII,UTF-8有关吗?

    How encode/decode works?

    首先,我们需要了解在计算机的历史上,机器的语言和人的语言之间如何互相翻译。

    ASCII ,UTF 是什么?

    找到了一篇非常好的文章,来阐述这个问题。https://blog.hubspot.com/website/what-is-utf-8

    简单来说,计算机只能理解二进制数据,准确的来说其实是电流信号,比如0101->低高低高。但是人只能理解各自的语言,让人的语言和计算机的语言能够互相翻译,就需要编码。

    很早之前,计算机技术还不发达,只有灯塔国用计算机,那么他们就只给英文用到的字符编码,这其实就是ASCII,用一个byte也就8个bits来表示字母。


    https://ascii-tables.com/

    但是随着计算机技术的发展,世界上很多别的语言体系也需要编码了,ASCII的256个字符明显不够用了。

    这时候就出现了Unicode, 可以简单理解为它会为任何语言的任何字符一个身份证号,至于具体的实现原理很复杂,我还没研究。有了Unicode, 极大扩展了字符容量,甚至表情也可以有编码。

    但是这还不够,因为Unicode只是一种规范,还并没有对应的实现。这时候的编码还不是010101这种二进制的,计算机依旧不能理解,那么UTF-8就出来了。

    UTF-8可以将每个code point转成1,2,3,4个byte的二进制串。这里有一个很巧秒的策略,对于那些常用的字符,用1个byte,比如ASCII中的所有字符,在UTF-8中依旧使用1个byte来表示的,不常用的则用更多的byte来存,整体来看,可以节约不少存储空间。UTF-8目前已经是全球认可的编码规范了。

    UTF-16相比UTF-8的区别是,它将code point转成2个或者4个bytes, 只在一些非英语的语言中使用到。

    中国的编码系统怎么来的?

    英文的话,总共就26个字母,但是中文文字多多了,怎么指定Unicode,是什么组织起草维护,提交,进入国际规范的?

    在知乎找到了一篇通俗易懂的解答:
    Unicode 和 UTF-8 有什么区别? - 盛世唐朝的回答 - 知乎
    https://www.zhihu.com/question/23374078/answer/69732605

    那base64编码又是什么?

    Base64 encoding encodes any binary data or non-ASCII text data to printable ASCII format so that it can be safely transmitted over any communication channel.

    同样在知乎找到一个简单易懂的解答:
    让你彻底理解Base64算法(Base64是什么,Base64解决什么问题,Base64字符串末尾的=是什么) - shusheng007的文章 - 知乎
    https://zhuanlan.zhihu.com/p/384238870

    简单来说,如果直接在不同的网络设备中传输二进制,可能会遇到一些数据被当成特定系统的特殊含义字符,所以将二进制再转成ASCII,避免错误。

    encodeURI & encodeURIComponent使用的是什么编码方式?

    The encodeURI() function encodes a URI by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character (will only be four escape sequences for characters composed of two "surrogate" characters).

    当看到one, two, three, or four escape sequences就可以得知,就是UTF-8编码了,以为只有UTF-8是可变长的编码。

    那么,为什么空格会变成%20而不是20呢?
    http://www.jsons.cn/utf8/ 根据实验结果,%是一个分隔符。

    不过为什么ecodeURI不编码 A-Z a-z 0-9 ; , / ? : @ & = + $ - _ . ! ~ * ' ( ) #呢?因为它是针对一个完整的URI编码,如果编码这些字符会造成错杀。

    encodeURI 与 encodeURIComponent的区别

    see: http://xkr.us/articles/javascript/encode-compare/
    总地来说, encode一个完整的URI的时候用前者,他会忽略
    ~!@#$&()=:/,;?+'
    只是encodeURI中的一部分时,用后者,它仅忽略
    ~!
    ()'

    相关文章

      网友评论

          本文标题:All about encode & decode

          本文链接:https://www.haomeiwen.com/subject/ulbkprtx.html