编码问题

· 3 min read

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编码!!!
Authors
Developer, digital product enthusiast, tinkerer, sharer, open source lover