背景
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
コメント