前端也須要了解的字符發展歷史

字節

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

image

單位

  • 8位 = 1字節
  • 1024字節 = 1K
  • 1024K = 1M
  • 1024M = 1G
  • 1024G = 1T

JavaScript中的進制

1. JavaScript中的進製表示

若是想獲得20的值,使用各類進制是如何表示的bash

let a = 0b10100;//二進制(0b表示的是二進制,後面爲值)
let b = 0o24;//八進制(0o表示的是八進制,後面爲值)
let c = 20;//十進制
let d = 0x14;//十六進制(0x表示的是十六進制,後面爲值)
console.log(a );//20
console.log(b);//20
console.log(c);//20
console.log(d);//20
複製代碼
2. JavaScript中的進制轉換
  • 10進制轉任意進制 10進制數.toString(目標進制)
let c = 20;
//10進制轉爲二進制
console.log(c.toString(2));//10100
//10進制轉爲八進制
console.log(c.toString(8));//24
//10進制轉爲十六進制
console.log(c.toString(16));//14
複製代碼
  • 任意進制轉十進制 parseInt('任意進制字符串', 原始進制)
console.log(parseInt('10100', 2));//20
複製代碼

ASCII

最開始計算機只在美國用,八位的字節能夠組合出256種不一樣狀態。0-32種狀態規定了特殊用途,一旦終端、打印機趕上約定好的這些字節被傳過來時,就要作一些約定的動做,如:網絡

  • 趕上0×10, 終端就換行;
  • 趕上0×07, 終端就向人們嘟嘟叫;

又把全部的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第 127 號,這樣計算機就能夠用不一樣字節來存儲英語的文字了 這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0ui

image

這個方案叫作 ASCII 編碼 American Standard Code for Information Interchange:美國信息互換標準代碼編碼

GB2312

後來西歐一些國家用的不是英文,它們的字母在ASCII裏沒有爲了能夠保存他們的文字,他們使用127號這後的空位來保存新的字母,一直編到了最後一位255。好比法語中的é的編碼爲130。固然了不一樣國家表示的符號也不同,好比,130在法語編碼中表明瞭é,在希伯來語編碼中卻表明了字母Gimel (ג)。 中國爲了表示漢字,把127號以後的符號取消了,規定spa

  • 一個小於127的字符的意義與原來相同,但兩個大於 127 的字符連在一塊兒時,就表示一個漢字;
  • 前面的一個字節(他稱之爲高字節)從0xA1用到0xF7,後面一個字節(低字節)從 0xA1 到 0xFE;
  • 這樣咱們就能夠組合出大約7000多個(247-161)*(254-161)=(7998)簡體漢字了。
  • 還把數學符號、日文假名和ASCII裏原來就有的數字、標點和字母都從新編成兩個字長的編碼。這就是全角字符,127如下那些就叫半角字符。

把這種漢字方案叫作 GB2312。GB2312 是對 ASCII 的中文擴展。 GB表示國標的意思。code

GBK

後來仍是不夠用,因而乾脆再也不要求低字節必定是 127 號以後的內碼,只要第一個字節是大於 127 就固定表示這是一個漢字的開始,又增長了近 20000 個新的漢字(包括繁體字)和符號。orm

GB18030 / DBCS

又加了幾千個新的少數民族的字,GBK擴成了GB18030 通稱他們叫作 DBCS Double Byte Character Set:雙字節字符集。 在 DBCS 系列標準裏,最大的特色是兩字節長的漢字字符和一字節長的英文字符並存於同一套編碼方案裏 各個國家都像中國這樣搞出一套本身的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼cdn

Unicode

如今來到了最重要的編碼方案blog

ISO 的國際組織廢了全部的地區性編碼方案,從新搞一個包括了地球上全部文化、全部字母和符 的編碼! Unicode 固然是一個很大的集合,如今的規模能夠容納100多萬個符號。 ISO 就直接規定必須用兩個字節,也就是 16 位來統一表示全部的字符,對於 ASCII 裏的那些 半角字符,Unicode 保持其原編碼不變,只是將其長度由原來的 8 位擴展爲16 位,而其餘文化和語言的字符則所有從新統一編碼。 從 Unicode 開始,不管是半角的英文字母,仍是全角的漢字,它們都是統一的一個字符!同時,也都是統一的兩個字節ip

UTF-8

Unicode 在很長一段時間內沒法推廣,直到互聯網的出現,爲解決 Unicode 如何在網絡上傳輸的問題,因而面向傳輸的衆多 UTF 標準出現了

  • UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式
  • UTF-8就是每次以8個位爲單位傳輸數據
  • 而UTF-16就是每次 16 個位
  • UTF-8 最大的一個特色,就是它是一種變長的編碼方式
  • Unicode 一箇中文字符佔 2 個字節,而 UTF-8 一箇中文字符佔 3 個字節
  • UTF-8 是 Unicode 的實現方式之一

編碼規則

  1. 對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。所以對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。
  2. 對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n+ 1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼。

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
複製代碼
相關文章
相關標籤/搜索