以前端的角度看字符编码

时间:2024-01-23 19:00:52

做了2年前端,一直对字符编码不够理解,最近要做图片上传,所以花了点时间把这个给了解清楚。

首先,计算机中数据存储的最小单位是位,英文是bit,简记为b,每个0或1就是一个位。一个字节由8个位组成,比如11011100,所以一个字节可以表示的范围是00000000~11111111,转换成十进制就是0~255。

什么是ASCII码?

把所有的空格、标点符号、数字、英文大小写字母用连续的字节来表示,从0一直编到了第127号,这个编码方案就是”ASCII”编码,比如字母a的ascii编码就是97.但有些国家的语言不都是英文字母,所以把127号之后的空位也用来表示字符,一直编码到255,所以从128到255的这些字符集被称为‘扩展字符集’。

什么是GB2312?

中国人因为没有可以利用的字节来表示汉字,所以定义了一个规则,一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。但这个规则是中国自己定义的,并不适合其他国家使用。

什么是unicode?

为了统一全世界的编码, ISO (国际标谁化组织)的国际组织废了所有的地区性编码方案,推出了“Universal Multiple-Octet Coded Character Set,即unicode,规定了必须用两个字节,也就是16位来统一表示所有的字符。简单来说,就是用0-65535这些数字来对应世界上所有的字符。对于ASCII里的127位之前的字符,unicode包持其原编码不变,只是将其长度由原 来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于”半角”英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在 保存英文文本时会多浪费一倍的空间。

什么是UTF-8和UTF-16?

为了把字符对应的数字保存在计算机中,主要有UTF-8和UTF-16两种方式。UTF-16是把所有的字符对应的数字都用2个字节来表示,缺点是英文字母明明用一个字节来表示就够了,会白白多浪费一倍的空间。
于是就有了UTF-8,这个8很容易误导人,不是用一个字节表示一个字符,而是用可变的字节数来表示字符,可能一个,也可能2个或三个,最大是3个。比如英文字符用一个字节表示,中午字符用2个或三个字节来表示。