let a = 0b10100;//二进制
let b = 0o24;//八进制
let c = 20;//十进制
let d = 0x14;//十六进制
console.log(a == b);
console.log(b == c);
console.log(c == d);
复制代码
console.log(c.toString(2));
复制代码
console.log(parseInt('10100', 2));
复制代码
最开始计算机只在美国用,八位的字节能够组合出256种不一样状态。0-32种状态规定了特殊用途,一旦终端、打印机赶上约定好的这些字节被传过来时,就要作一些约定的动做,如:前端
又把全部的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第 127 号,这样计算机就能够用不一样字节来存储英语的文字了浏览器
这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0bash
这个方案叫作 ASCII 编码网络
American Standard Code for Information Interchange:美国信息互换标准代码函数
后来西欧一些国家用的不是英文,它们的字母在ASCII里没有为了能够保存他们的文字,他们使用127号这后的空位来保存新的字母,一直编到了最后一位255。好比法语中的é的编码为130。固然了不一样国家表示的符号也不同,好比,130在法语编码中表明了é,在希伯来语编码中却表明了字母Gimel (ג)。工具
从128 到 255 这一页的字符集被称为扩展字符集。ui
中国为了表示汉字,把127号以后的符号取消了,规定编码
0xA1
用到0xF7
,后面一个字节(低字节)从 0xA1
到 0xFE
;后来仍是不够用,因而干脆再也不要求低字节必定是 127 号以后的内码,只要第一个字节是大于 127 就固定表示这是一个汉字的开始,又增长了近 20000 个新的汉字(包括繁体字)和符号。spa
又加了几千个新的少数民族的字,GBK
扩成了GB18030
通称他们叫作 DBCS.net
Double Byte Character Set:双字节字符集。
在 DBCS 系列标准里,最大的特色是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里
各个国家都像中国这样搞出一套本身的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码
ISO 的国际组织废了全部的地区性编码方案,从新搞一个包括了地球上全部文化、全部字母和符 的编码! Unicode 固然是一个很大的集合,如今的规模能够容纳100多万个符号。
ISO 就直接规定必须用两个字节,也就是 16 位来统一表示全部的字符,对于 ASCII 里的那些 半角字符,Unicode 保持其原编码不变,只是将其长度由原来的 8 位扩展为16 位,而其余文化和语言的字符则所有从新统一编码。
从 Unicode 开始,不管是半角的英文字母,仍是全角的汉字,它们都是统一的一个字符!同时,也都是统一的 两个字节
Unicode 在很长一段时间内没法推广,直到互联网的出现,为解决 Unicode 如何在网络上传输的问题,因而面向传输的众多 UTF 标准出现了,
Universal Character Set(UCS)Transfer Format:UTF编码
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
复制代码
function transfer(num) {
let ary = ['1110', '10', '10'];
let binary = num.toString(2);
ary[2] = ary[2]+binary.slice(binary.length-6);
ary[1] = ary[1]+binary.slice(binary.length-12,binary.length-6);
ary[0] = ary[0]+binary.slice(0,binary.length-12).padStart(4,'0');
let result = ary.join('');
return parseInt(result,2).toString(16);
}
//万
let result = transfer(0x4E07);//E4B887
复制代码
C1 1100 0001
AA 1010 1010
CD 1100 1101
A8 1010 1000
0000000001101010->006A(106)->j
0000001101101000->0368(872)->?
复制代码
使用NodeJS编写前端工具时,操做得最多的是文本文件,所以也就涉及到了文件编码的处理问题。咱们经常使用的文本编码有UTF8和GBK两种,而且UTF8文件还可能带有BOM。在读取不一样编码的文本文件时,须要将文件内容转换为JS使用的UTF8编码字符串后才能正常处理。
BOM用于标记一个文本文件使用Unicode编码,其自己是一个Unicode字符("\uFEFF"),位于文本文件头部。在不一样的Unicode编码下,BOM字符对应的二进制字节以下:
Bytes Encoding
----------------------------
FE FF UTF16BE
FF FE UTF16LE
EF BB BF UTF8
复制代码
所以,咱们能够根据文本文件头几个字节等于啥来判断文件是否包含BOM,以及使用哪一种Unicode编码。可是,BOM字符虽然起到了标记文件编码的做用,其自己却不属于文件内容的一部分,若是读取文本文件时不去掉BOM,在某些使用场景下就会有问题。例如咱们把几个JS文件合并成一个文件后,若是文件中间含有BOM字符,就会致使浏览器JS语法错误。所以,使用NodeJS读取文本文件时,通常须要去掉BOM
function readText(pathname) {
var bin = fs.readFileSync(pathname);
if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) {
bin = bin.slice(3);
}
return bin.toString('utf-8');
}
复制代码
NodeJS支持在读取文本文件时,或者在Buffer转换为字符串时指定文本编码,但遗憾的是,GBK编码不在NodeJS自身支持范围内。所以,通常咱们借助iconv-lite这个三方包来转换编码。使用NPM下载该包后,咱们能够按下边方式编写一个读取GBK文本文件的函数。
var iconv = require('iconv-lite');
function readGBKText(pathname) {
var bin = fs.readFileSync(pathname);
return iconv.decode(bin, 'gbk');
}复制代码