node.jsで文字コードの不明なファイルを読み込む

文字コードの不明なファイルから文字コードを検出して、文字列を読み込む方法です。

encoding-japaneseをインストールします。

npm install encoding-japanese --save

encoding-japaneseを読み込みます。

const Encoding = require('encoding-japanese');

ファイルを読み込みます。
このとき、文字コードを指定せず、Bufferを受け取ります。

const fs = require('fs');

// バイナリファイルを読み込む
const buffer = fs.readFileSync('euc.txt');

文字コードを検出します。

// 文字コードの検出
const detected = Encoding.detect(buffer);
console.log(`文字コードは「${detected}」です`);

文字列に変換します。

// 文字列に変換する
const text = Encoding.convert(buffer, {
  from: detected,
  to: 'UNICODE',
  type: 'string',
});
console.log(`文字列は「${text}」です`);

全体のコードは次のようになります。

const fs = require('fs');
const Encoding = require('encoding-japanese');

// バイナリファイルを読み込む
const buffer = fs.readFileSync('euc.txt');

// 文字コードの検出
const detected = Encoding.detect(buffer);
console.log(`文字コードは「${detected}」です`);

// 文字列に変換する
const text = Encoding.convert(buffer, {
  from: detected,
  to: 'UNICODE',
  type: 'string',
});
console.log(`文字列は「${text}」です`);

JavaScriptで文字コードを推測する

encoding-japaneseを使って、文字コードを検出する方法を紹介します。

encoding-japaneseを読み込む

scriptタグで読み込む方法とrequire()で読み込む方法があります。

scriptタグで読み込む場合は次のタグをHTMLファイルに追加します。

<script src="encoding.min.js"></script>

require()で読み込む場合は、encoding-japaneseをインストールして、

npm install encoding-japanese

require()でencoding-japaneseを読み込みます。

const Encoding = require('encoding-japanese');

文字コードを検出する

detect()の引数にバイト配列を渡すと、文字コードを得られます。

const detected = Encoding.detect(bytes);

次の文字コードに対応しています。

  • ‘UTF32’ (detect only)
  • ‘UTF16’
  • ‘UTF16BE’
  • ‘UTF16LE’
  • ‘BINARY’ (detect only)
  • ‘ASCII’ (detect only)
  • ‘JIS’
  • ‘UTF8’
  • ‘EUCJP’
  • ‘SJIS’
  • ‘UNICODE’ (JavaScript Unicode Array)

サンプルコード

次のコードはバイト配列の文字コードを検出し、バイト配列を文字列に変換して出力するコードです。

const Encoding = require('encoding-japanese');

const euc = [0xA4, 0xB3, 0xA4, 0xEC, 0xA4, 0xCF, 0xA5, 0xC6, 0xA5, 0xB9, 0xA5, 0xC8, 0xA4, 0xC7, 0xA4, 0xB9, 0xA1, 0xA3];
const jis = [0x1B, 0x24, 0x42, 0x24, 0x33, 0x24, 0x6C, 0x24, 0x4F, 0x25, 0x46, 0x25, 0x39, 0x25, 0x48, 0x24, 0x47, 0x24, 0x39, 0x21, 0x23, 0x1B, 0x28, 0x42];
const sjis = [0x82, 0xB1, 0x82, 0xEA, 0x82, 0xCD, 0x83, 0x65, 0x83, 0x58, 0x83, 0x67, 0x82, 0xC5, 0x82, 0xB7, 0x81, 0x42];
const utf8 = [0xE3, 0x81, 0x93, 0xE3, 0x82, 0x8C, 0xE3, 0x81, 0xAF, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, 0x81, 0xA7, 0xE3, 0x81, 0x99, 0xE3, 0x80, 0x82];

const print = (bytes) => {
  // 文字コードの検出
  const detected = Encoding.detect(bytes);
  console.log(`文字コードは「${detected}」です`);

  const text = Encoding.convert(bytes, {
    from: detected,
    to: 'UNICODE',
    type: 'string',
  });
  console.log(`文字列は「${text}」です`);
};
[euc, jis, sjis, utf8].forEach(bytes => print(bytes));

node.jsでShift_JISのテキストファイルに書き込む

Shift_JISのテキストファイルに書き込むには、encoding-japaneseを使ってJa文字列をShift_JISのバイト配列に変換して保存します。

UTF-8のテキストファイルに書き込む方法は、「node.jsでUTF-8のテキストファイルに書き込む」をご覧ください。

encoding-japaneseのインストール

npm install encoding-japanese

Shift_JISのテキストファイルに書き込む

const fs = require('fs');
const Encoding = require('encoding-japanese');

// ファイル名
const file = 'sjisのテキストファイル.txt';
// データ
const text = 'この文字列の文字コードはShift_JISです。';
// 文字コード
const charset = 'SJIS';
// 文字列をShift_JISに変換する
const sjisBytes = Encoding.convert(text, {
  from: 'UNICODE',
  to: charset,
  type: 'arraybuffer',
});

// ファイルに書き込む
fs.writeFileSync(file, Buffer.from(sjisBytes));

node.jsでUTF-8のテキストファイルに書き込む

UTF-8のテキストファイルに書き込むには、次の関数を使用します。

Shift_JISのテキストファイルに書き込む方法は、「node.jsでShift_JISのテキストファイルに書き込む」をご覧ください。

fs.writeFileSync(file, data[, options])

fs.writeFileSync(file, data[, options])は、同期書き込みします。

引数にファイル名、保存する文字列、文字コードを渡します。

const fs = require('fs');

// ファイル名
const file = 'utf8のテキストファイル.txt';
// データ
const data = 'utf8の文字列です。';
// 文字コード
const charset = 'utf8';
// テキストファイルに書き込む
fs.writeFileSync(file, data, charset);

fs.writeFile(file, data[, options], callback)

fs.writeFile(file, data[, options], callback)は、非同期書き込みします。

引数にファイル名、保存する文字列、文字コードを渡します。

コールバック関数は引数にエラーオブジェクトを取ります。

const fs = require('fs');

// ファイル名
const file = 'utf8のテキストファイル.txt';
// データ
const text = 'utf8の文字列です。';
// 文字コード
const charset = 'utf8';
// テキストファイルに書き込む
fs.writeFile(file, text, charset, (err) => {
  if (err) {
    console.log(err);
  } else {
    console.log('保存しました。');
  }
});