在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 文本編碼
文本編碼
小結
API 走馬觀花
API 走馬觀花
迭代
小結
運行
回調
需求
代碼設計模式
進程介紹
模塊
工程目錄
小結
小結
遍歷目錄
小結
小結
API 走馬觀花
用途
NPM
小結
安裝
網絡操作介紹
二進制模塊
什么是 NodeJS
命令行程序
靈機一點
域(Domain)
應用場景
模塊路徑解析規(guī)則
文件拷貝

文本編碼

使用 NodeJS 編寫前端工具時,操作得最多的是文本文件,因此也就涉及到了文件編碼的處理問題。我們常用的文本編碼有 UTF8 和 GBK 兩種,并且 UTF8 文件還可能帶有 BOM。在讀取不同編碼的文本文件時,需要將文件內容轉換為 JS 使用的 UTF8 編碼字符串后才能正常處理。

BOM 的移除

BOM 用于標記一個文本文件使用 Unicode 編碼,其本身是一個 Unicode 字符("\uFEFF"),位于文本文件頭部。在不同的 Unicode 編碼下,BOM 字符對應的二進制字節(jié)如下:

    Bytes      Encoding
----------------------------
    FE FF       UTF16BE
    FF FE       UTF16LE
    EF BB BF    UTF8

因此,我們可以根據文本文件頭幾個字節(jié)等于啥來判斷文件是否包含 BOM,以及使用哪種 Unicode 編碼。但是,BOM 字符雖然起到了標記文件編碼的作用,其本身卻不屬于文件內容的一部分,如果讀取文本文件時不去掉 BOM,在某些使用場景下就會有問題。例如我們把幾個 JS 文件合并成一個文件后,如果文件中間含有 BOM 字符,就會導致瀏覽器 JS 語法錯誤。因此,使用 NodeJS 讀取文本文件時,一般需要去掉 BOM。例如,以下代碼實現了識別和去除 UTF8 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');
}

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');
}

單字節(jié)編碼

有時候,我們無法預知需要讀取的文件采用哪種編碼,因此也就無法指定正確的編碼。比如我們要處理的某些 CSS 文件中,有的用 GBK 編碼,有的用 UTF8 編碼。雖然可以一定程度可以根據文件的字節(jié)內容猜測出文本編碼,但這里要介紹的是有些局限,但是要簡單得多的一種技術。

首先我們知道,如果一個文本文件只包含英文字符,比如 Hello World,那無論用 GBK 編碼或是 UTF8 編碼讀取這個文件都是沒問題的。這是因為在這些編碼下,ASCII0~128 范圍內字符都使用相同的單字節(jié)編碼。

反過來講,即使一個文本文件中有中文等字符,如果我們需要處理的字符僅在 ASCII0~128 范圍內,比如除了注釋和字符串以外的JS代碼,我們就可以統(tǒng)一使用單字節(jié)編碼來讀取文件,不用關心文件的實際編碼是 GBK 還是 UTF8。以下示例說明了這種方法。

1. GBK編碼源文件內容:

    var foo = '中文';

2. 對應字節(jié):

    76 61 72 20 66 6F 6F 20 3D 20 27 D6 D0 CE C4 27 3B

3. 使用單字節(jié)編碼讀取后得到的內容:

    var foo = '{亂碼}{亂碼}{亂碼}{亂碼}';

4. 替換內容:

    var bar = '{亂碼}{亂碼}{亂碼}{亂碼}';

5. 使用單字節(jié)編碼保存后對應字節(jié):

    76 61 72 20 62 61 72 20 3D 20 27 D6 D0 CE C4 27 3B

6. 使用 GBK 編碼讀取后得到內容:

    var bar = '中文';

這里的訣竅在于,不管大于 0xEF 的單個字節(jié)在單字節(jié)編碼下被解析成什么亂碼字符,使用同樣的單字節(jié)編碼保存這些亂碼字符時,背后對應的字節(jié)保持不變。

NodeJS 中自帶了一種 binary 編碼可以用來實現這個方法,因此在下例中,我們使用這種編碼來演示上例對應的代碼該怎么寫。

function replace(pathname) {
    var str = fs.readFileSync(pathname, 'binary');
    str = str.replace('foo', 'bar');
    fs.writeFileSync(pathname, str, 'binary');
}
上一篇:小結下一篇:安裝