急速入門前端編碼知識

1. 字符發展歷史

1.1 字節

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

1.2 單位

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

1.3 JavaScript中的進制

1.3.1 進製表示

let a = 0b10100;//二進制
let b = 0o24;//八進制
let c = 20;//十進制
let d = 0x14;//十六進制
console.log(a == b);
console.log(b == c);
console.log(c == d);
複製代碼

1.3.2 進制轉換

  • 10進制轉任意進制 10進制數.toString(目標進制)
    console.log(c.toString(2));
    複製代碼
  • 任意進制轉十進制 parseInt('任意進制字符串', 原始進制);
    console.log(parseInt('10100', 2));
    複製代碼

1.4 ASCII

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

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

又把全部的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第 127 號,這樣計算機就能夠用不一樣字節來存儲英語的文字了瀏覽器

這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0bash

bits

這個方案叫作 ASCII 編碼網絡

American Standard Code for Information Interchange:美國信息互換標準代碼函數

1.5 GB2312

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

從128 到 255 這一頁的字符集被稱爲擴展字符集。ui

中國爲了表示漢字,把127號以後的符號取消了,規定編碼

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

1.6 GBK

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

1.7 GB18030 / DBCS

又加了幾千個新的少數民族的字,GBK擴成了GB18030 通稱他們叫作 DBCS.net

Double Byte Character Set:雙字節字符集。

在 DBCS 系列標準裏,最大的特色是兩字節長的漢字字符和一字節長的英文字符並存於同一套編碼方案裏

各個國家都像中國這樣搞出一套本身的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼

1.8 Unicode

ISO 的國際組織廢了全部的地區性編碼方案,從新搞一個包括了地球上全部文化、全部字母和符 的編碼! Unicode 固然是一個很大的集合,如今的規模能夠容納100多萬個符號。

  • International Organization for Standardization:國際標準化組織。
  • Universal Multiple-Octet Coded Character Set,簡稱 UCS,俗稱 Unicode

ISO 就直接規定必須用兩個字節,也就是 16 位來統一表示全部的字符,對於 ASCII 裏的那些 半角字符,Unicode 保持其原編碼不變,只是將其長度由原來的 8 位擴展爲16 位,而其餘文化和語言的字符則所有從新統一編碼。

從 Unicode 開始,不管是半角的英文字母,仍是全角的漢字,它們都是統一的一個字符!同時,也都是統一的 兩個字節

  • 字節是一個8位的物理存貯單元,
  • 而字符則是一個文化相關的符號。

1.9 UTF-8

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

Universal Character Set(UCS)Transfer Format:UTF編碼

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

1.10 編碼規則

  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
複製代碼

1.11 聯通不如移動

C1 1100 0001
AA 1010 1010
CD 1100 1101
A8 1010 1000

0000000001101010->006A(106)->j
0000001101101000->0368(872)->?
複製代碼

1.12 文本編碼

使用NodeJS編寫前端工具時,操做得最多的是文本文件,所以也就涉及到了文件編碼的處理問題。咱們經常使用的文本編碼有UTF8和GBK兩種,而且UTF8文件還可能帶有BOM。在讀取不一樣編碼的文本文件時,須要將文件內容轉換爲JS使用的UTF8編碼字符串後才能正常處理。

1.12.1 BOM的移除

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

1.12.2 GBK轉UTF8

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