QR コード作成 JavaScript の説明 |
[ご注意] このプログラム及びこのページの記述はだいぶ古くなっています. このプログラムは,当初 1999年版の JIS 規格の仕様に基づいて作成し,その後 2004年の改正に伴って一部を修正しました.このページの説明も,1999年版仕様のプログラムについて書いたものを,2004年版の公開の際に一部加筆・修正したものです. 最初にこのプログラムを作った頃は,QR コードについての情報はあまり多くはありませんでしたが,その後 QR コードについての解説や,ソース コードが公開されている実装も多くなってきたようです. QR コード自体についての説明をお探しの方は,もっと新しいページをご覧になることをお勧めします. 使い方 「データ」にエンコードするデータを入力し,適当な「誤り訂正レベル」を選んで「作成」をクリックします. 画面上部に,入力したデータに対応する QR コードが表示されます. 入力したデータにエンコードできない文字が含まれているときは「エンコードできない文字があります!」と表示されますので,データを修正してください. 入力したデータが長すぎるときは「データが長すぎます!」と表示されますので,データを短くするか誤り訂正レベルを下げてください. 入力データが長くなると,使用ブラウザによってはかなり処理時間がかかることがあります.焦らず気長にお待ちください. QR コードの大きさ QR コードの仕様にはモデル 1 とモデル 2 がありますが,このプログラムで作成するのはモデル 2 です. モデル 2 では型番が 1 から 40 まであり,型番が上がるほど多くのデータをエンコードできますが,QR コードの大きさも大きくなります. エンコードできる最大データ長は型番,誤り訂正レベルとモードで決まります. 各型番,誤り訂正レベル,モードの最大データ長(文字数)は以下のようになります. 型番をあまり大きくすると処理が遅くなります.このプログラムではエンコード可能な型番を最大 10 に制限してあります. 最大の型番に合わせてあらかじめ表示領域を用意しているため,入力データ長が同じであっても最大の型番を大きく設定するとそれだけ処理が遅くなります. 処理速度はブラウザの種類/バージョンによってかなり差があります.特に入力データが長くなると差が顕著になります.私がテストしたブラウザの中では Netscape 4,Netscape 7 が比較的速く,Opera 6 はかなり遅いという結果になりました. エンコード可能な最大型番は,プログラムの最初の方にある
で定義してあります.この数字を大きく(最大 40)すれば,より大きな型番の QR コードを作成できるようになりますが,型番を大きくするとそれだけ処理が遅くなります.表示には白/黒のデータ(モジュール)の画像をテーブルを使って並べていますので,型番を大きくするとテーブルが大きくなることになります.あまりテーブルが大きくなるとブラウザがクラッシュするかも知れません. もっと型番を大きくしたいと思われる方は,その辺に注意しながら上記の数値を変更してみてください. 仕様の不明確な点 QR コードの仕様は JIS 規格(X 0510)で規定されています.しかし,私が読んだ限りでは,仕様にどうも曖昧な点があるように感じました. 曖昧な箇所は主にマスク処理結果の評価に関する部分です.評価条件の記述に厳密性を欠いていて,複数の解釈が可能なように思います. どういう解釈が正しいか,QR コードに関する書籍等の記事を調べたり,ウェブでも検索してみましたが,結局はっきりしたことは判りませんでした. QR コードを作成するプログラムでソースが公開されているものを,いくつか参考に入手しましたが,それらを見てもこの部分については皆少しずつ処理が異なっています. 仕方がないので,この部分については私なりの解釈で作成してあります.したがって,恐らく規格の意図する処理とは違っていると思います. ただ,マスク処理については,もし規格と異なるマスクを採用したとしても,直ちに QR コードが読み取り不能になるとは思えません.多分ほとんどのデータでは,どのマスクを採用しても(リーダーの性能にもよるでしょうが)読み取り可能ではないかと思います. また,評価の方法が厳密には規格と異なるものであったとしても,全くでたらめな評価をしている訳ではないので,そのために最も不適切なマスクを採用してしまうなどということは多分ないだろうと思います. したがって,このことが原因で正常に読み取りができなくなることはまずないだろうと思っています. JIS X 0510 は 1999年に制定され,2004年に改正されました. 改正ではマスク処理結果の評価に関係する部分について 1 箇所仕様が変更されました.また「参考」として補足説明が追加されています. 1999年版で曖昧だった箇所のうち一部については「参考」の記述で明確になりましたが,多くの箇所は依然曖昧なままです.また,「参考」として追加された記述に定義と矛盾するものがあり,さらに不明確になってしまった部分もあります. JIS X 0510 には実際の QR コードのサンプルが載っている箇所が 2 箇所あります.(正確には 3 箇所ありますが,そのうちひとつは構造的連接(連結)に関するものなのでここでは除外します.) 2 つのうち一方は,1999年版と 2004年版で採用されているマスクが異なっています.上記の仕様変更により変わったものと思われます. 以前,1999年版の仕様に基づいて作成したプログラムを公開していましたが,そのプログラムでそのサンプルと同じデータおよび誤り訂正レベルで QR コードを作成すると,少なくともそれらについてはサンプルと同じマスクが採用されていました. 現在のプログラムは,仕様変更に対応し,「参考」により明確になった箇所についてそれに合うように修正したものです.依然曖昧な箇所については前のプログラムと同じ処理のままにしています. 新しいプログラムでサンプルと同じデータおよび誤り訂正レベルで QR コードを作成すると,2 つとも古いプログラムとは異なるマスクが採用されます.規格の 1999年版と 2004年版でマスクが変わった方のサンプルについても,規格で採用されているマスクとこのプログラムで採用するマスクは違うものです. つまり,新しいプログラムではどちらのサンプルについても,規格とは異なるマスクが採用されるようになってしまいました. 曖昧な箇所についてはいろいろな解釈を試してみましたが,規格と同じマスクが採用されるようにはなりませんでした.したがって,私が曖昧だと思っている箇所以外にも,私が解釈を間違えている箇所があるかも知れません. しかし,規格に載っているサンプルでも 1999年版と 2004年版でマスクが変わっていることは,マスクが違っても読み取りに大きな支障はないことを意味していると考えられます. 規格が変わったからといって,世の中に出回っている QR コードやリーダーが自動的に新しい規格に合わせて変わる訳ではありませんから,もしマスクが異なると読み取りができないということになると,古い規格に基づいた QR コードは新しいリーダーでは読み取れない,また新しい規格に基づいた QR コードは古いリーダーでは読み取れないということになってしまいます. QR コードは既に広く普及しているので,そのようなことになれば混乱を招くでしょう. 規格改正に際しては,そのようなことが起きないように考慮されただろうと思います(あくまでも推測ですが).その上でマスクが変わるような変更が行われたということは,どのマスクを採用するかについてはそれほど厳密に考えなくてもよいということではないかと思います. Unicode に関して このプログラムが JavaScript であるために,入力データの中の特定の文字がエンコードできない,または違う文字にエンコードされてしまう場合があるかも知れません. (古い仕様の charCodeAt() などを別にすれば)JavaScript で扱う文字コードは Unicode です.ブラウザを動かしている環境のネイティブな文字コードに拘らず,JavaScript が受け取る入力データは Unicode に変換されたものになります. このプログラムでは Unicode から,QR コードにエンコード可能な文字への変換を行います.入力データから Unicode へのマッピングの仕方によっては,変換の際にエンコード不可と判断されたり別の文字に化けてしまうことがあるかも知れません. QR コードでエンコードできる文字は JIS X 0201 のラテン文字・片仮名用 8 ビット符号で表される文字と,区点番号 1-1 〜 86-33 の範囲の漢字です. このプログラムでは Unicode の文字のうち以下の範囲のものをエンコードします. (a) ラテン文字 U+0000 〜 U+007F,U+00A5,U+203E U+0000 〜 U+007F の範囲の文字は,Unicode をそのまま JIS X 0201 のラテン文字のコード(1 バイト)として扱います. 厳密には U+0000 〜 U+007Fの文字集合と JIS X 0201 のラテン文字用文字集合は異なるものですが,以下に述べるように,この範囲の文字はそのまま JIS X 0201 のコード 00 〜 7F(16進)にマッピングするのが適当と考えました. ● JIS X 0201 の円記号‘¥’(実際には半角,16進でコード 5C)の扱い(b) 半角カナ U+FF61 〜 U+FF9F U+FF61 〜 U+FF9F の範囲の文字は,JIS X 0201 の片仮名(8 ビット符号)のコード A1 〜 DF(16進)に変換します. (c) 漢字 JIS 区点番号 1-1 〜 84-6 の範囲に対応する文字をシフト JIS に変換します. いくつかの文字については複数の異なるマッピングが存在します.このプログラムでは,以下のように複数の Unicode を同じシフト JIS に変換しています.
モードの選択 QR コードには 4 種類の符号化モードがあり,それぞれエンコードできる文字が定められています. 仕様では複数のモードを混在させることもできますが,このプログラムでは処理を簡単にするため,データ全体をひとつのモードでエンコードします. 入力データがすべて(半角)数字の場合 → 「数字モード」8 ビット バイト モードでは コード 80 〜 9F,E0 〜 FF(16進)の位置は「未定義」となっていますが,シフト JIS 用に使用することもできるという記述があります. このプログラムでは,入力データに漢字と漢字以外の文字が混在している場合,漢字モードは使わず,すべて 8 ビット バイト モードでエンコードします. |