## 字节
* 计算机内部,所有信息最终都是一个二进制值
* 每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)
![](https://box.kancloud.cn/8858629d380359ef78bc6c9d86bc70c1_500x250.png)
<br>
<br>
## 单位
* 8位 = 1字节
* 1024字节 = 1K
* 1024K = 1M
* 1024M = 1G
* 1024G = 1T
<br>
<br>
## JavaScript中的进制
#### 进制表示
```
let a = 0b10100;//二进制
let b = 0o24;//八进制
let c = 20;//十进制
let d = 0x14;//十六进制
console.log(a == b);
console.log(b == c);
console.log(c == d);
```
#### 进制转换
```
// 10进制转任意进制 10进制数.toString(目标进制)
console.log(c.toString(2));
// 任意进制转十进制 parseInt('任意进制字符串', 原始进制);
console.log(parseInt('10100', 2));
```
<br>
#### ASCII
最开始计算机只在美国用,八位的字节可以组合出256种不同状态,一直编到了第 127 号,这样计算机就可以用不同字节来存储英语的文字了
![](https://box.kancloud.cn/f48ea68ce02b77091442236eb0c92601_700x494.png)
这个方案叫做 ASCII 编码
> American Standard Code for Information Interchange:美国信息互换标准代码
<br>
#### GB2312
其他非英语国家,比如中文博大精深的中国,8位不够用,所以增加到16位,汉字方案叫GB2312。GB2312 是对 ASCII 的中文扩展
<br>
#### GBK
后来还是不够用,于是又扩充了,增加了近 20000 个新的汉字(包括繁体字)和符号。
<br>
#### GB18030 / DBCS
又加了几千个新的少数民族的字,GBK扩成了GB18030 通称他们叫做 DBCS
<br>
#### Unicode
各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码
,Unicode 一统江湖,现在的规模可以容纳100多万个符号。
<br>
#### UTF-8
Unicode 在很长一段时间内无法推广,直到互联网的出现,为解决 Unicode 如何在网络上传输的问题,于是面向传输的UTF-8 出现了,
<br>
#### base64
小的图片会转base64,减少http请求
base64比原图片大,所以大图片不用base64
fileReader(H5)读取文件拿到的就是base64编码的图片
<br>
## 文本编码
#### BOM的移除
```
// y.txt是ANSI的,就是GBK,另存为z.txt(utf8),gbk另存utf8或者合并文件的时候会出现BOM头
fs.readFile('./z.txt', function (err, data) {
console.log(stripBOM(data));
});
fs.readFile('./z.txt', 'utf-8', function (err, data) {
console.log(stripBOM(data));
});
// 丢弃BOM头
function stripBOM(bin) {
// console.log(typeof bin);
if (typeof bin === 'string') {
if(bin.charCodeAt(0) === 0xFEFF){
return bin.slice(1);
}
}else{
if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) {
return bin.slice(3).toString('utf-8');
}
return bin;
}
}
```
<br>
#### GBK转UTF8
```
var iconv = require('iconv-lite');
function readGBKText(pathname) {
var bin = fs.readFileSync(pathname);
return iconv.decode(bin, 'gbk');
}
```
## Buffer乱码
```
const fs = require('fs');
const {StringDecoder} = require('string_decoder');
let b = Buffer.from('中国');
let sd = new StringDecoder();
// console.log(b.slice(0, 4).toString());
// 通过sd写二进制不会导致一组编码断开而乱码,会识别多出来的编码并缓存
console.log(sd.write(b.slice(0, 4)));
console.log(sd.write(b.slice(4)));
```
- 初级前端题
- 必会
- http协议
- 跨域
- cookie与storage
- 移动端问题
- 性能优化
- Vue全家桶
- 有哪些常用的es6语法?
- 项目
- 闭包
- JSON
- 数据类型与运算
- 数组
- DOM
- 字符串
- 要会
- async与await
- 正则
- this
- 数据加密
- 实时获取数据
- 原生ajax
- 异步打印
- css相关
- 杂七杂八
- webpack
- 一般
- mvvm模式
- 异步请求
- XSS
- 其他dom问题
- 冷门
- 浏览器缓存机制
- 新
- 浏览器事件轮询
- Promise
- 树的深度优先与广度优先
- 拷贝
- 继承
- Vue
- 跨域
- 排序
- 浏览器
- 浏览器入门
- 浏览器内核知识
- 浏览器渲染原理
- 浏览器性能调优
- 自动化构建
- 字符编码
- git
- 一些题目
- 其他
- 逻辑思维题
- 互联网公司招聘信息如何阅读
- bat面试