计算机基础:ASCII 、UTF-8、Unicode是什么,乱码如何产生?

恶补基础

字节(Byte)

字节(Byte) :是计算机数据的基本存储单位,一个中文占2个字节

  • 1byte(字节) = 8bit(位二级制数)
  • 1KB = 1024字节
  • 1MB = 1024KB
  • 1GB = 1024MB
  • 1TB = 1024GB

一个字节表示最大整数为255(二进制11111111 = 十进制255),两个字节65535

:字由若干字节构成,是据算计处理数据时一次存取,加工和传送的数据长度。字是计算机处理数据和运算的单位。

字长

字长:字的位数叫字长,计算机的字长决定了其CPU一次操作处理实际位数的多少,字在不同的地址出现其含义是不相同。例如,送往控制器去的字是指令,而送往运算器去的字就是一个数。

  • 8 位机子:一个字等于1个字节,字长为8位;
  • 16位机子:一个字等于2个字节,字长为16位;
  • 32位机子:一个字等于4个字节,字长为32位;
  • 64位机子:一个字等于8个字节,字长为64位;

这里的多少位指的是字长,而字又是由字节构成,所以 字长/8 就知道一个字有多少字节了。

硬盘生产商是以GB(十进制,即10的3次方=1000,如1MB=1000KB)计算的,而电脑(操作系统)是以GiB(2进制,即2的10次方, 如1MiB=1024KiB)计算的,但是国内用户一般理解为1MiB=1M=1024 KB, 所以为了便于中文化的理解,翻译MiB为MB也是可以的。
同样根据硬盘厂商与用户对于1MB大小的不同理解,所以好多160G的硬盘实际容量按计算机实际的1MiB=1024KB算都不到160G,这也可以解释为什么新买的硬盘“缺斤短两”并没有它所标示的那么大。

字符集

字符(Character)是各种文字和符号的总称,字符集(Character set)是多个字符的集合。

  1. ASCII:主要用于显示现代英语和其他西欧语言
  2. GB2312:简体中文字符集
  3. BIG5:台湾
  4. GB18030:中国大陆、香港、台湾、日本和韩国等东亚地区
  5. Unicode:为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。使用十六进制数字,而且在书写时在前面加上前缀“U+”。
    5.1 UTF-8
    UTF-8是Unicode的其中一个使用方式。UTF是 Unicode Tranformation Format,即把Unicode转做某种格式的意思。
    使用可变长度字节来储存 Unicode字符,使得双字节的Unicode能够在现存的处理单字节的系统上正确传输。

正文

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器

escape、encodeURI、encodeURIComponent、base64、btoa区别

JavaScript中有三个可以对字符串编码的函数,分别是: escape、encodeURI、encodeURIComponent,
相应3个解码函数:unescape、decodeURI、decodeURIComponent。

escape

escape 函数与encodeURI、encodeURIComponent是两路人。

escape 是对字符串进行编码,以便在所有的计算机上读取该字符串,而另外两个函数是对 URL 进行转码。

如果只是编码字符串,和 URL 没有任何关系,那么用escape。

encodeURI 和 encodeURIComponent

encodeURI(URI);
encodeURIComponent(str);

如果需要编码整个 URL 并且使用这个 URL,那么应该用 encodeURI。

当需要编码 URL 中的参数的时候,那么 encodeURIComponent 是最好的选择。

它们都是编码URL,唯一区别就是编码的字符范围,其中
encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&()=:/,;?+’
encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!
()’

为什么会有base64

在这里插入图片描述

由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。

问: 什么是“可打印字符”呢?
答: 在ASCII码中规定,031、128这33个字符属于控制字符,32127这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。

问: 那么该怎么才能传输其他字符呢?
答: 其中一种方式就是使用Base64。Base64一般用于在HTTP协议下传输二进制数据。

在这里插入图片描述
可以看到“Son”通过Base64编码转换成了“U29u”。这是刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示:
在这里插入图片描述
每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。

base64

https://github.com/dankogai/js-base64

let latin = 'dankogai';
let utf8  = '小飼弾'
let u8s   =  new Uint8Array([100,97,110,107,111,103,97,105]);
Base64.encode(latin);             // ZGFua29nYWk=
Base64.encode(latin, true);       // ZGFua29nYWk skips padding
Base64.encodeURI(latin);          // ZGFua29nYWk
Base64.btoa(latin);               // ZGFua29nYWk=
Base64.btoa(utf8);                // raises exception
Base64.fromUint8Array(u8s);       // ZGFua29nYWk=
Base64.fromUint8Array(u8s, true); // ZGFua29nYW which is URI safe
Base64.encode(utf8);              // 5bCP6aO85by+
Base64.encode(utf8, true)         // 5bCP6aO85by-
Base64.encodeURI(utf8);           // 5bCP6aO85by-

.decode() vs .atob

var pngBase64 = 
  "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=";

Base64.decode()解码utf - 8编码的字符串,而Base64.atob()解码字节
使用:Base64.atob(pngBase64)
不要用:Base64.decode()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lvan的前端笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值