编码问题
常见的编码设定
- IDE/编辑器
截图为WebStorm
编辑器下针对单个文件的编码设定
网页源码
截图为
Chrome
下浏览网页源码网络请求
截图为Chrome下查看XHR请求数据
网址链接
程序语言
编码的目的
计算机内部所有信息中最终都是二进制值即0和1,所以编码需要解决所有的字符符号的存取/显示
ASCII/Unicode/UTF-8
常常遇到的编码相关概念有这几个,但需要区分清楚
ASCII
是基于拉丁字母的编码
,只能表示128
个字符,因此无法表示很多语言字符,比如中文- 128个字符包含了
a-zA-Z 52个字符,0-9 10个数字字符,+-等符号及一些不可见字符,比如ACK
- 128个字符包含了
Unicode
是字符集
,目的是对全世界所有符号进行编码,比如中/日/英文,Unicode规定了所有符号的二进制代码比如
中
转Unicode是\u4e2d
,比如ウ
转Unicode是\u30a6
,所以每个符号都可以有唯一的二进制进行对应。但注意,所有符号对应的二进制代码定长,如果真的按照这样进行存储会很浪费,比如越靠前的越浪费。因此Unicode虽好,但并不能按照这样真的进行存取- Unicode叫统一码,也叫万国码、单一码,是一种编码国际化方案
UTF-8/ASCII
是编码
,编码决定具体怎么存/传输,so,UTF-8 是 Unicode 的实现方式之一
,比如中
转UTF-8是中
- UTF-8兼容ASCII
- 抽象来说,unicode只是一个interface,UTF-XX 是这个接口的实现
时间线
- ASCII第一版标准发布于
1963年
- Unicode第一版发布于
1991年
- UTF-8创建于
1992年
文件的编码方式存在哪?
Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格”(zero width no-break space)
其它编码
base64编码
其特点是
所有的二进制文件,都可以转化为可打印的文本编码,使用文本软件进行编辑;
能够对文本进行简单的加密。
除了base64,还有个base58,相比base64,base58不使用数字”0”,字母大写”O”,字母大写”I”,和字母小写”l”,以及”+”和”/“符号。即 64-6
URL编码
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)