因为计算机只能处理数字,所以如果要处理文本,就得先把文本转换成数字才能处理。
- ASCII
最早计算机在设计时采用8bit作为一个字节(byte),所以一个字节能标识的最大整数就是255「11111111(B) = 255」,0-255被用来标识大小写英文字母、数字和一些符号,这个编码表就被称为ASCII编码。其中英文字符集只需要128位,因此第一位是0。 - Unicode
在ASCII编码之后,其他国家语言的字符集也需要对应的编码来表示,于是一时间出现了多种编码方式,在一段时间内出现了同一个二进制数在不同的语言中代表不同的字符的现象(中国指定了GB2312编码),因此互联网上的文件用不同的编码方式打开显示的是不同的文字,这时就迫切的需要一个超集出现来涵盖世界上所有语言中的字符用于统一所有文字的编码,于是Unicode出现了。
Unicode中一个二进制数代表唯一一个字符。 - UTF-8
Unicode是一个很大的集合,目前可以表示100多万个字符。那么到底该如何对这些二进制数进行存储呢,于是出现了UTF-8, UTF-16,UTF-32等多种编码方式,其中互联网上使用最广泛的一种就是UTF-8编码方式,这是一种变长的编码方式。
UTF-8编码方式也很简单,分为两种情况:
- 用1个字节表示英文字符集,第一位统一为0;
- 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。(详见阮一峰的文章)
而中文字符大约是10万个左右,而2个字节最多仅可以表示65536个字符,因此中文的UTF-8码一般是2~3个字节。
- 二进制流
我们通常将图片/音频等文件用二进制流(最底层的数据格式)来表示。
二进制存储图片的优势:
- 二进制文件比较节约空间,在储存字符型数据时与普通存储并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间;
- 内存中参加计算的数据都是用二进制无格式储存起来的,因此,使用二进制储存到文件就更快捷。如果储存为文本文件,则需要一个转换的过程。在数据量很大的时候,两者就会有明显的速度差别了;
- 涉及到一些比较精确的数据,使用二进制储存不会造成有效位的丢失;
- base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法(编码二进制),即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括 字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。
base64也可以用于编码字符,但是仅可对 ASCII 字符进行编码,也就是单字节字符(可以理解为英文和数字,还有一些简单符号)。若编码中文字符串,则需先转换为 ASCII 字符。
总结:ASCII, Unicode和UTF-8三者之间的关系是ASCII和Unicode都是字符集,其中Unicode码包含ASCII码,而UTF-8只是Unicode二进制数字符集的一种编码方式而已。
base64也可以理解为一种编码方式
补充说明一下图片在后端存储方式:
- 其一:可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;
- 其二:将图片转换成二进制流,直接存储到数据库的 Image 类型字段中;
参考:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
https://juejin.cn/post/6844904040090828814
https://www.imyangyong.com/blog/2019/05/javascript/%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%B5%81/