字節(jié)
- 計算機(jī)內(nèi)部,所有信息最終都是一個二進(jìn)制值
- 每一個二進(jìn)制位(bit)有0和1兩種狀態(tài),因此八個二進(jìn)制位就可以組合出256種狀態(tài)欺栗,這被稱為一個字節(jié)(byte)
單位
- 8位 = 1字節(jié)
- 1024字節(jié) = 1K
- 1024K = 1M
- 1024M = 1G
- 1024G = 1T
JavaScript中的進(jìn)制
1. JavaScript中的進(jìn)制表示
如果想得到20的值,使用各種進(jìn)制是如何表示的
let a = 0b10100;//二進(jìn)制(0b表示的是二進(jìn)制,后面為值)
let b = 0o24;//八進(jìn)制(0o表示的是八進(jìn)制虑瀑,后面為值)
let c = 20;//十進(jìn)制
let d = 0x14;//十六進(jìn)制(0x表示的是十六進(jìn)制,后面為值)
console.log(a );//20
console.log(b);//20
console.log(c);//20
console.log(d);//20
2. JavaScript中的進(jìn)制轉(zhuǎn)換
- 10進(jìn)制轉(zhuǎn)任意進(jìn)制 10進(jìn)制數(shù).toString(目標(biāo)進(jìn)制)
let c = 20;
//10進(jìn)制轉(zhuǎn)為二進(jìn)制
console.log(c.toString(2));//10100
//10進(jìn)制轉(zhuǎn)為八進(jìn)制
console.log(c.toString(8));//24
//10進(jìn)制轉(zhuǎn)為十六進(jìn)制
console.log(c.toString(16));//14
- 任意進(jìn)制轉(zhuǎn)十進(jìn)制 parseInt('任意進(jìn)制字符串', 原始進(jìn)制)
console.log(parseInt('10100', 2));//20
ASCII
最開始計算機(jī)只在美國用滴须,八位的字節(jié)可以組合出256種不同狀態(tài)舌狗。0-32種狀態(tài)規(guī)定了特殊用途,一旦終端、打印機(jī)遇上約定好的這些字節(jié)被傳過來時扔水,就要做一些約定的動作痛侍,如:
- 遇上0×10, 終端就換行;
- 遇上0×07, 終端就向人們嘟嘟叫;
又把所有的空格主届、標(biāo)點符號赵哲、數(shù)字、大小寫字母分別用連續(xù)的字節(jié)狀態(tài)表示君丁,一直編到了第 127 號枫夺,這樣計算機(jī)就可以用不同字節(jié)來存儲英語的文字了
這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節(jié)的后面7位绘闷,最前面的一位統(tǒng)一規(guī)定為0
這個方案叫做 ASCII 編碼
American Standard Code for Information Interchange:美國信息互換標(biāo)準(zhǔn)代碼
GB2312
后來西歐一些國家用的不是英文橡庞,它們的字母在ASCII里沒有為了可以保存他們的文字,他們使用127號這后的空位來保存新的字母印蔗,一直編到了最后一位255扒最。比如法語中的é的編碼為130。當(dāng)然了不同國家表示的符號也不一樣华嘹,比如吧趣,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (?)除呵。
中國為了表示漢字再菊,把127號之后的符號取消了,規(guī)定
- 一個小于127的字符的意義與原來相同颜曾,但兩個大于 127 的字符連在一起時纠拔,就表示一個漢字;
- 前面的一個字節(jié)(他稱之為高字節(jié))從0xA1用到0xF7泛豪,后面一個字節(jié)(低字節(jié))從 0xA1 到 0xFE稠诲;
- 這樣我們就可以組合出大約7000多個(247-161)*(254-161)=(7998)簡體漢字了。
- 還把數(shù)學(xué)符號诡曙、日文假名和ASCII里原來就有的數(shù)字臀叙、標(biāo)點和字母都重新編成兩個字長的編碼。這就是全角字符价卤,127以下那些就叫半角字符劝萤。
把這種漢字方案叫做 GB2312。GB2312 是對 ASCII 的中文擴(kuò)展慎璧。
GB表示國標(biāo)的意思床嫌。
GBK
后來還是不夠用,于是干脆不再要求低字節(jié)一定是 127 號之后的內(nèi)碼胸私,只要第一個字節(jié)是大于 127 就固定表示這是一個漢字的開始,又增加了近 20000 個新的漢字(包括繁體字)和符號厌处。
GB18030 / DBCS
又加了幾千個新的少數(shù)民族的字,GBK擴(kuò)成了GB18030 通稱他們叫做 DBCS
Double Byte Character Set:雙字節(jié)字符集岁疼。
在 DBCS 系列標(biāo)準(zhǔn)里阔涉,最大的特點是兩字節(jié)長的漢字字符和一字節(jié)長的英文字符并存于同一套編碼方案里
各個國家都像中國這樣搞出一套自己的編碼標(biāo)準(zhǔn),結(jié)果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼
Unicode
現(xiàn)在來到了最重要的編碼方案
ISO 的國際組織廢了所有的地區(qū)性編碼方案瑰排,重新搞一個包括了地球上所有文化贯要、所有字母和符 的編碼! Unicode 當(dāng)然是一個很大的集合凶伙,現(xiàn)在的規(guī)墓希可以容納100多萬個符號函荣。
ISO 就直接規(guī)定必須用兩個字節(jié),也就是 16 位來統(tǒng)一表示所有的字符傻挂,對于 ASCII 里的那些 半角字符挖息,Unicode 保持其原編碼不變,只是將其長度由原來的 8 位擴(kuò)展為16 位绪抛,而其他文化和語言的字符則全部重新統(tǒng)一編碼电禀。
從 Unicode 開始,無論是半角的英文字母尖飞,還是全角的漢字政基,它們都是統(tǒng)一的一個字符!同時沮明,也都是統(tǒng)一的兩個字節(jié)
UTF-8
Unicode 在很長一段時間內(nèi)無法推廣,直到互聯(lián)網(wǎng)的出現(xiàn)酱畅,為解決 Unicode 如何在網(wǎng)絡(luò)上傳輸?shù)膯栴}摧扇,于是面向傳輸?shù)谋姸?UTF 標(biāo)準(zhǔn)出現(xiàn)了
- UTF-8 就是在互聯(lián)網(wǎng)上使用最廣的一種 Unicode 的實現(xiàn)方式
- UTF-8就是每次以8個位為單位傳輸數(shù)據(jù)
- 而UTF-16就是每次 16 個位
- UTF-8 最大的一個特點,就是它是一種變長的編碼方式
- Unicode 一個中文字符占 2 個字節(jié)吁峻,而 UTF-8 一個中文字符占 3 個字節(jié)
- UTF-8 是 Unicode 的實現(xiàn)方式之一
編碼規(guī)則
- 對于單字節(jié)的符號,字節(jié)的第一位設(shè)為0用含,后面7位為這個符號的 Unicode 碼。因此對于英語字母痴鳄,UTF-8 編碼和 ASCII 碼是相同的缸夹。
- 對于n字節(jié)的符號(n > 1),第一個字節(jié)的前n位都設(shè)為1橡类,第n+ 1位設(shè)為0芽唇,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進(jìn)制位匆笤,全部為這個符號的 Unicode 碼炮捧。
Unicode符號范圍 | UTF-8編碼方式
(十六進(jìn)制) | (二進(jìn)制)
----------------------+---------------------------------------------
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