## 字節
* 計算機內部,所有信息最終都是一個二進制值
* 每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱為一個字節(byte)

<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 號,這樣計算機就可以用不同字節來存儲英語的文字了

這個方案叫做 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面試