在我們平時的前端開發中,可能用到進制轉換的地方并不多,但是我們要往node全棧方向發展,尤其是處理‘流’的時候,進制轉換就需要我們了解了,這篇文章且作為開始學習‘流’的開胃菜吧!
1.字元的發展
首先還是要說一下字元的發展,純計算機專業人員和老司機請跳過這部分。計算機的基本功能其實是對資料進行運算和加工處理,計算機中的資料有兩類:數值資料和非數值資料。這兩種在計算機中都是用 二進制 表示的,是以這裡簡單說一下 數制 :
- 二進制:每個二進制位隻有兩個不同的數位0和1,逢二進一,八個二進制位可以組合出256種狀态,這被稱為一個位元組(byte)。
- 八進制:八進制位擁有八個不同的數位0~7,逢8進1。
- 十進制:十進制數就是我們日常所見的由0~9組成的數。
- 十六進制十六進制位有16個不同的數位,即0到9,A到F,逢16進1。
- 8位 = 1位元組
- 1024位元組 = 1K
- 1024K = 1M
- 1024M = 1G
- 1024G = 1T
在C語言中,0開始的表示八進制,0x開始的表示十六進制,并沒有二進制的直接表示法,而在JS中,使用0b開始的表示二進制,0o開始的表示八進制,0x的表示十六進制。
2.常見編碼
二十一進制碼(BCD碼):
特點是保留了十進制數的權,而數字則用二進制數位0和1的組合來表示,在需要高精度的計算中BCD編碼比較常用(了解)。
ASCII碼
是美國資訊交換标準委員會制定的7位字元編碼,用7位二進制碼表示一個字元,一直編到了第127号,可以用不同位元組來儲存英文,由于隻用了一個位元組(8位)中的7位,是以最前面一位統一規定為0,計算機中常用一個位元組,來存放一個字元的ASCII碼。ASCII表
GB2312
随着計算機的發展,後來一些西歐國家用的不是英文,為了儲存他們的文字,他們使用127号之後的空位儲存新的字母(一個8位的位元組可以組合256種狀态,ASCII隻編到127号),一直編到最後一位255,而且不同國家表示的符号也不一樣。中國為了表示漢字,我們把127号之後的符号取消了,一個小于127的字元的意義與原來相同,但兩個大于 127 的字元連在一起時,就表示一個漢字,也可以說GB2312是對ASCII的中文擴充。可後來還是不夠用,是以後來隻要求隻要第一個位元組是大于127就固定表示這是一個漢字的開始,又增加了近 20000 個新的漢字(包括繁體字)和符号。我們稱之為GBK編碼。
GB18030 / DBCS
随着中國計算機的發展,在編碼中又增加了幾千個新的少數民族的字,GBK擴充成了GB18030統稱它們叫做DBCS。
Unicode
ISO(國際标準化組織)廢棄了所有地區性編碼方案,做了一套包括了地球上所有文化、符号以及字母的編碼,這是一個很大的集合,可以容納100多萬個符号。ISO規定:必須用兩個位元組,也就是16位來統一表示所有的字元,無論是半角的英文字母,還是全角的漢字,它們都是統一的一個字元!同時,也都是統一的兩個位元組。
UTF-8
這應該屬于前端最常見的一種編碼方式了,為解決Unicode如何在網絡上傳輸的問題,于是面向傳輸的衆多 UTF 标準出現了:
- UTF-8 網際網路上使用最廣的一種 Unicode 的實作方式,每次以8個位為機關傳輸資料
- UTF-16就是每次 16 個位
UTF-8 最大的一個特點,就是它是一種變長的編碼方式,Unicode一個中文字元占 2 個位元組,而UTF-8一個中文字元占3個位元組,UTF-8是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 |
3.JS進制轉換方法
------十進制轉其他-------
var a = ;
a.toString();//11000
a.toString();//30
a.toString();//18
------其他轉十進制-------
var b=,c=,d=;
console.log(parseInt(b, )); // 二進制轉十進制
console.log(parseInt(c, )); // 八進制轉十進制
console.log(parseInt(d, ));// 十六進制轉十進制
複制代碼
4.前端需要注意的編碼問題
在使用nodeJS編寫前端工具時,對文本檔案的操作比較多,這就涉及到了檔案的編碼問題,常用的文本編碼有UTF8和GBK兩種,并且UTF8檔案還可能帶有BOM(位元組順序标記),在讀取不同編碼的文本檔案時,需要将檔案内容轉換為JS使用的UTF8編碼字元串後才能正常處理。
一、BOM的移除
BOM用于标記一個文本檔案使用Unicode編碼,其本身是一個Unicode字元("\uFEFF"),位于文本檔案頭部。在不同的Unicode編碼下,BOM字元對應的二進制位元組如下:
Bytes | Encoding |
---|---|
FE FF | UTF16BE |
FF FE | UTF16LE |
EF BB BF | UTF8 |
是以我們可以通過檔案頭的幾個位元組來判斷檔案是否包含BOM以及使用哪種Unicode,如果讀取檔案的時候不去掉BOM,假如我們将幾個JS檔案合并成一個,如果檔案中含有BOM字元,就會導緻文法錯誤,是以我們用 nodeJS讀取檔案是一般先去掉BOM
var bin = fs.readFileSync(pathname);//通過node 中fs子產品同步讀檔案内容
//判斷檔案頭的位元組
if (bin[] === && bin[] === && bin[] === ) {
bin = bin.slice();
}
複制代碼
2.GBK轉UTF8
NodeJS支援在讀取文本檔案時,或者在Buffer轉換為字元串時指定文本編碼,但GBK編碼不在NodeJS自身支援範圍内,一般我們借助iconv-lite這個三方包來轉換編碼,首先使用npm下載下傳這個第三方包,讀取GBK檔案函數如下:
var iconv = require('iconv-lite');
function readGBKText(pathname) {
var myFs = fs.readFileSync(pathname);
return iconv.decode(myFs, 'gbk');
}
複制代碼
———————————————————記錄前端路上的一點一滴