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');
}複製代碼