编码问题

https://static.1991421.cn/2022/2022-07-05-225814.jpeg

常见的编码设定

  1. IDE/编辑器

​ 截图为WebStorm编辑器下针对单个文件的编码设定
image

  1. 网页源码

    截图为Chrome下浏览网页源码

    image

    image

  2. 网络请求

    截图为Chrome下查看XHR请求数据

    image

image

image-20220724223834393

  1. 网址链接

    image

  2. 程序语言
    image

编码的目的

计算机内部所有信息中最终都是二进制值即0和1,所以编码需要解决所有的字符符号的存取/显示

https://static.1991421.cn/2022/2022-07-05-225147.jpeg

ASCII/Unicode/UTF-8

常常遇到的编码相关概念有这几个,但需要区分清楚

  1. ASCII是基于拉丁字母编码,只能表示128个字符,因此无法表示很多语言字符,比如中文

    • 128个字符包含了a-zA-Z 52个字符,0-9 10个数字字符,+-等符号及一些不可见字符,比如ACK
  2. Unicode字符集,目的是对全世界所有符号进行编码,比如中/日/英文,Unicode规定了所有符号的二进制代码

    比如转Unicode是\u4e2d,比如 转Unicode是\u30a6,所以每个符号都可以有唯一的二进制进行对应。但注意,所有符号对应的二进制代码定长,如果真的按照这样进行存储会很浪费,比如越靠前的越浪费。因此Unicode虽好,但并不能按照这样真的进行存取

    • Unicode叫统一码,也叫万国码、单一码,是一种编码国际化方案
  3. UTF-8/ASCII编码,编码决定具体怎么存/传输,so,UTF-8 是 Unicode 的实现方式之一 ,比如转UTF-8是中

    • UTF-8兼容ASCII
    • 抽象来说,unicode只是一个interface,UTF-XX 是这个接口的实现

时间线

  1. ASCII第一版标准发布于1963年
  2. Unicode第一版发布于1991年
  3. UTF-8创建于1992年

文件的编码方式存在哪?

Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格”(zero width no-break space)

其它编码

base64编码

其特点是

  • 所有的二进制文件,都可以转化为可打印的文本编码,使用文本软件进行编辑;

  • 能够对文本进行简单的加密。

除了base64,还有个base58,相比base64,base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/“符号。即 64-6

URL编码

image

JS范畴提供了对应函数来处理URL编码,即encodeURI/encodeURIComponent

为什么会乱码

存储编码/显示编码的不一致性

![image-20220703175332829](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703175332829.png)

![image-20220703175750816](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703175750816.png)

![image-20220703180749581](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703180749581.png)

例子中的ISO8859-1是以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母符号,藉以供使用附加符号拉丁字母语言使用的升级版,但依然不能表示中文字符。

UTF-16并不向后兼容UTF-8

识别编码

https://github.com/aikuyun/iterm2-zmodem/blob/master/iterm2-recv-zmodem.sh

![image-20220703211018747](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703211018747.png)

![image-20220703211555644](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703211555644.png)

![image-20220703214219452](/Users/alanhe/Library/Mobile Documents/comappleCloudDocs/Typora/image-20220703214219452.png)

相关doc

  1. 字符编码笔记:ASCII,Unicode 和 UTF-8
  2. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
  3. ASCII码表
  4. 乱码
  5. 为什么要进行URL编码!!!