node-qrcodeでShift-JISを扱う

背景

node.js のバックエンドでQRコードの生成を扱う場合、node-qrcode が最もメジャーなパッケージです。
このnode-qrcodeでShift-JISを扱うことがあったため、メモを残しておきます。

公式の使い方

公式では次のようにSJIS変換用の関数があるから、それを使うように案内されています。

  var QRCode = require('qrcode')
  var toSJIS = require('qrcode/helper/to-sjis')

  QRCode.toDataURL(kanjiString, { toSJISFunc: toSJIS }, function (err, url) {
    console.log(url)
  })

しかし、このやり方は一部の漢字で以下のエラーが出てクラッシュし、使用できませんでした。

Error: Invalid SJIS character: 安

どうやらSJISへの変換処理があまり賢くないようです。

バイナリで扱う

対策としては、2つ考えられます。
1. 自作でSJIS変換関数を作成する
2. バイナリ形式で漢字を扱う

1の方がデータサイズが小さくなりますので、QRの画像サイズが小さくなるメリットがありますが、作成はかなり手間がかかります。
2については、リーダーが対応しているかが問題になりますが、試したところ多くのリーダーが対応していたためこちらを使用することとしました。

Shift-JISへの変換には実績の多いiconvを使用します。

const iconv_lite = require('iconv-lite');
const filepath = "./test.png"
let text = "a1あア1一安心"
let text_sjis = iconv_lite.encode(text, 'sjis')

let options = {
    errorCorrectionLevel: 'M'
}
let input_text = [{
    data: text_sjis, mode: 'byte'
}]
QRCode.toFile(filepath, input_text, options);


これで、Shift-JISのQRコードが作成できました。

参考まで。

参考文献

GitHub - soldair/node-qrcode: qr code generator
qr code generator. Contribute to soldair/node-qrcode development by creating an account on GitHub.
QRコードとは?|QRコードドットコム|株式会社デンソーウェーブ
QRコードの特長、規格などの知識が身につきます!
301 Moved Permanently

コメント

タイトルとURLをコピーしました