企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 字节 * 计算机内部,所有信息最终都是一个二进制值 * 每一个二进制位(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))); ```