使用Node.Js產生big5檔案

前言

現在主流都是UTF-8為主,而Node.Js本身預設也都是UTF-8
但對於一些老舊系統,可能仍是使用BIG-5。也沒辦法更改
若又需要與他交換檔案的話,就必須產出BIG-5檔案
而Node.Js原生並不支援產生BIG-5檔案!

而不論怎麼下關鍵字,網路上只能搜到讀取BIG-5,轉UTF-8的作法

解決思路

想到Node.Js可以執行shell指令,既然原生不提供,那就透過三方程式!
最後順利使用原生指令iconv解決問題
若平台是MacOS、Linux的話,基本上滿簡單的
平台原生提供iconv指令,可以直接轉換。不需要額外準備程式
若是Windows,就比較麻煩了。需要再準備iconv for Windows
所幸網路一搜就可以很迅速找到
下載回來後放在專案目錄下,在需要轉換時,指定到該目錄執行就可以使用了!

iconv的用法也相當簡單

iconv -f UTF-8 -t BIG-5 source_utf8.txt > target_big5.txt

就可以直接轉換了

程式碼

iconv指令測通後,剩下就簡單了!
直接上程式碼!

import * as fs from 'fs';
import * as util from 'util';

async generateBig5File() {
    const exec = util.promisify(util.exec); // 將Node.Js的exec指令封裝成promise,便於使用async, await
    
    const writeLines = '文字內容文字內容\r\n第二行文字內容第二行文字內容';

    const utf8File = `${process.cwd()}/temp/path/for/utf8.txt`;
    const big5File = `${process.cwd()}/target/path/for/big5.txt`;

    fs.appendFileSync(utf8File, writeLines);

    let iconvExecPath = 'iconv'; // macOS、Linux 原生指令,可以直接使用
    if (process.platform === 'win32') {
        // Windows 須籍助iconv for windows
        if (!existsSync(`${process.cwd()}/path/to/iconv/bin/iconv.exe`)) {
            console.error('iconv for windows 不存在!無法進行格式轉換!');
            throw new Error('iconv for windows 不存在!無法進行格式轉換!');
        }
        // 指向iconv for windows 執行檔路徑
        iconvExecPath = `${process.cwd()}/path/to/iconv/bin/iconv`;
    }

    await exec(`${iconvExecPath} -f UTF-8 -t BIG-5 ${utf8File} > ${big5File}`);
    fs.unlinkSync(utf8File); // 刪除暫存用的uft8檔案
    console.log(`已成功將UTF-8檔案轉換成BIG-5,刪除UTF-8暫存檔。並將檔案放置指定目錄:${big5File}`);        
}

await generateBig5File();