Node.jsでHTMLファイルのテキスト置換とエンコードの変更方法

HTMLのテキスト置換とエンコード変更

現在ではほとんどのHTMLファイルで文字エンコーディングはUTF-8が使用されているが、たまに古い環境でShift-JISを使用したい場合がある。

その場合UTF-8で作成したファイルの中身の記述とファイル自体の文字エンコーディングをShift-JISに変更する必要する必要があるのだが、これを手動で1つずつ修正するのは手間がかかるし作業ミスも発生しやすい。

しかし、Node.jsを使用すればコマンドを実行しただけで一括でファイルをShift-JISに変更することができる。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>サンプル</title>
</head>
<body>
<h1>サンプル</h1>
</body>
</html>

一括でUTF-8からShift-JISにする方法

今回はfoo.htmlとbar.htmlという2つのHTMLをUTF-8からShift-JISにする方法について解説する。

まず適当なプロジェクトフォルダを作成してcdで移動後、npm init -yでpackage.jsonを作成する。

次にasyncとiconv-liteを使用するので事前に以下のコマンドでインストールする。

npm i async iconv-lite

次にNode.jsで実行するJavaScriptファイルを適当な名前で作成して以下のようにコードを書く。

const fs = require('fs')
const async = require('async')
const iconv = require('iconv-lite')

async.each(['foo', 'bar'], (file) => {
  fs.readFile(`./src/${file}.html`, 'UTF-8', (err, data) => {
    if (err) return console.error(err)
    const result = data.replace(/UTF-8/ig, 'Shift_JIS')
    fs.writeFile(`./dist/${file}.html`, iconv.encode(result , 'Shift_JIS'), (err) => {
      if (err) return console.error(err)
    })
  })
})

あとは作成したファイルをnodeコマンドで実行するだけでHTMLファイルを置換できる。

node example.js

特定のファイル名を記述するのではなくglobを使用してマッチする拡張子全部を対象にする場合は以下の通り。

const fs = require('fs')
const glob = require('glob')
const async = require('async')
const iconv = require('iconv-lite')

glob('*.html',(err, files) => {
  async.each(files, (file) => {
    fs.readFile(`./src/${file}`, 'UTF-8', (err, data) => {
      if (err) console.error(err)
      const result = data.replace(/UTF-8/ig, 'Shift_JIS')
      fs.writeFile(`./dist/${file}`, iconv.encode(result , 'Shift_JIS'), (err) => {
        if (err) console.error(err)
      })
    })
  })
  if (err) console.error(err)
})