QRcode Perl/CGI & PHP scripts ver. 0.50j
                                               (c)2000-2013, Y.Swetake

１、このプログラムでできること。
　　このプログラムはperlあるいはPHPを用いてブラウザ上にQRcodeを
　表示するためのものです。
　　perl版(qr_img.cgi)はコマンドラインからでも動作します。
　　このバージョンでは QRcode model2 の version 1〜40 に対応して
　います。ただし以下の機能・モードは使用できません。

　　(1)、数字・英数字・８ビットモード以外のモード
　　(2)、コード内部でのモードの変更
　　　などなど

　　＃バージョン0.40より連結に試験的に対応しています。

　　＃引数に漢字のURLエンコードデータを渡してやると変換効率は悪いですが
　　　８ビットモードでエンコードすることはできますが正しく漢字と認識する
　　　かはデコード側の環境によります。

２、内容

 (ディレクトリ構造)

  qr_img0.50-+-perl--+- qr_img.cgi
             |       +- qr_image.pl
             |       +- qr_html.pl
             |
             +-data -+- qrvV_N.dat
             |       +- rscX.dat
             |       +- qrvfrV.dat
             |
             +-image-+- qrvV.png
             |       +- b.png d.png
             |       
             +-php  -- qr_img.php


　qr_img.cgi     ＱＲコード表示perl CGI（１つのimageを出力。ただしGDが必要。
　　　　　　　　　　　　　　　　　　　　または複数の画像を組み合わせてhtmlで表示）
　qr_image.pl　　perl版のpng,jpegイメージ出力コード
　qr_html.pl     perl版のhtml出力コード

　qrvV_N.dat 　　バージョンV,エラー訂正レベルN用データ
　rscX.dat　　　エラー訂正語生成処理に用いる演算テーブル
　qrvfrV.dat 　　バージョンV用固定領域データ(htmlモード用)

　qrvV.png 　　　バージョンV用固定イメージ(png,jpeg出力用)
　b.png          qr_img.cgiのhtmlモードで用いるpngファイル
　d.png          同上

　qr_img.php     ＱＲコード表示PHP（１つのimageを出力。ただしGDが必要。）

  README.txt  このファイル
  README.sjis このファイルのShiftJIS版
  README-e.txt 英語版ドキュメント

　処理を高速化するため各種演算結果をdatファイルにまとめています。
　そのため合計のファイルサイズが非常に大きくなっております。
　あらかじめ使うバージョンが限られている場合は使用しないdatファイルは
　削除しても問題ありません。
　なおrscX.datについてはJIS X 0510の表１５〜２１RSブロックの項目で
　(c,k,r)とある中のcとkの差がそれに該当します。
　例えばバージョン1-Mは(26,16,4)とあるので26-16=10でrsc10.datを使用
　します。

３、必要なもの
　実行に必要なもの
　perl版
　　・WWWサーバー　(perl CGIが動作するもの。)
　　・perl5

　　以下のものはqr_img.cgiのPNG/JPEG出力に必要です。
　　・GD
　　　　http://www.boutell.com/gd/
　　・GD.pm
　　　　http://stein.cshl.org/WWW/software/GD/GD.html
　　・libpng
    ・jpeg-6b

　　　プログラム中の png を gif に変更すると古いgd(1.5以前)とそれ用のGD.pmでも
　　動作しますが特許関連の問題が絡む恐れがありますの使用者自身の責任でお使いくだ
　　さい。

　PHP版
　　・WWWサーバー
　　・PHP4.1以降
　　・GD
　　・libpng

　注：GD 2.0について
　　　perl版,PHP版ともGD2.0.10未満およびPHP4.3.0バンドルの
　　　GDではGDのバグにより正常に動作しません。
　　　GD2.0.10以上をご使用ください。

　動作確認環境
　　perl版・PHP版とも
     Linux 2.4.18
　　 apache-1.3.27 + PHP-4.3.0(as apache module)
　　 perl 5.6.1
　　 GD 2.0.11
　　 GD.pm 2.06

　見るために必要なもの
　　・WWWブラウザ

４、使用方法
４．１、設定
４．１．１、perl版
　　　　　１行目の
    　　　#!/usr/bin/perl
　　　　　をそのサーバーのperlへのパスを指定します。

　　　　　次に下記を設定します

# -------- setting area --------
#

 $path="./../data";                # ---You must set path to data files.

＃　データファイル群("qrv*.dat","rsc*.dat")へのパスを指定します。
＃　デフォルトは同階層にある data ディレクトリです。

 # ---- for PNG or JPEG image
 $image_path="./../image";          # ---You must set path to QRcode frame images.

＃　固定領域イメージ群(qrv*.png)へのパスを指定します。
＃　デフォルトは同階層にある image ディレクトリです。

 # ---- for HTML mode
 $img_path4html="";           # ---You must set path to b.png and d.png.
                              # Default setting is document root.

＃　　HTMLモードの設定を行います。
＃　　同梱しているb.png d.pngを置いた場所へのパスまたはURLを指定します。
＃　　これらはドキュメントルートからのパスあるいはURLになります。
＃　　たとえばドキュメントルート下のimgディレクトリにおいたならば
＃
＃　　　$img_path4html="/img";
＃
＃　　　となります。

 @img_fn=("b.png","d.png");    # In html mode,image size depends these files.

＃
＃　　画像ファイルの名前を変更したい場合は"b.png","d.png"の部分を変更します。
＃　　htmlモードではイメージのサイズはこのファイルの画像の大きさに依存します。
＃

 $always_html_mode=0;

＃
＃　　1を設定すると常にhtmlモードで出力します。
＃

 $version_ul=40;

＃
＃    バージョンの上限を指定できます。値は１から４０の整数です。
＃

#
# ------- setting area end --------


４．１．２、PHP版

下記を設定します。
/* ------ setting area ------ */

$path="./../data";           /* You must set the path to data files. */

＃　データファイル群("qrv*.dat","rsc*.dat")へのパスを指定します。
＃　デフォルトは同階層にある data ディレクトリです。

$image_path="./../image";     /* You must set path to QRcode frame images. */

＃　固定領域イメージ群(qrvN.png)へのパスを指定します。
＃　デフォルトは同階層にある image ディレクトリです。

$version_ul=40;              /* upper limit for version */

＃バージョンの上限を指定できます。値は1から40の整数です。

/* ------ setting area end ------ */


４．２、書式
４．２．１、ブラウザからの呼び出し

　　　qr_img.cgi?d=data[&e=(L,M,Q,H)][&s=int size][&v=(1-40)][&t=(J,H)]
　　　           [&m=(1-16)&n=(2-16)[&o=original data][&p=(0-255)]]

　　　qr_img.php?d=data[&e=(L,M,Q,H)][&s=int size][&v=(1-40)][&t=J]
　　　           [&m=(1-16)&n=(2-16)[&o=original data][&p=(0-255)]]

　　　d:QRコード化するデータです。特殊文字や8bit文字はURLencodeされている
　　　　必要があります。(漢字や'%'は%+16進表記、空白は'+'等)
　　　　容量を超えるとエラー表示となります。
　　　　このパラメータは省略できません。

　　　e:エラー訂正レベル
　　　　エラー訂正レベルを指定します。
　　　　指定できるのはL,M,Q,Hの４種類で省略した場合 M が選択されます。

　　　s:モジュールサイズ
　　　　モジュールサイズを指定します。
　　　　指定できるのは1以上の整数でこの値でイメージのサイズが決定されます。
　　　　省略した場合 4(png) または 8(jpeg) が選択されます。
　　　　htmlモードでは意味を持ちません。

　　　v:バージョン
　　　　バージョンを指定します。
　　　　このプログラムで指定できるバージョンは1〜40です。
　　　　省略した場合はプログラムが自動選択します。

　　　t:画像タイプ
　　　　画像タイプを指定します。
　　　　省略した場合や下記文字以外はPNGを出力します。
　　　　Jを指定するとjpegで出力します。
　　　　Hを指定するとhtmlモードで出力します。
　　　　なおjpegでの出力はGDがjpeg対応している必要があります。


　　※以下は連結モード用のパラメータです。現在試験的に対応しています。

　　　m:連結の何個目のイメージか

　　　n:全部で何個のイメージがあるか

　　　o:元のデータ(URLエンコードされている必要があります。)

　　　p:元データから算出したパリティ値（各文字のアスキー値を排他論理和したもの）

　　　連結を指定するときはmとnは必須です。
　　　またoまたはpのいずれかを必ず指定する必要があります。

　　　例：abcdefgabcdefg0を２つに分割するとき

　　　１つめのイメージ
          qr_img.cgi?d=abcdefg&n=2&m=1&o=abcdefgabcdefg0
　　　２つめのイメージ
          qr_img.cgi?d=abcdefg0&n=2&m=2&o=abcdefgabcdefg0

　　　　またはあらかじめパリティ値を計算しておいて

　　　１つめのイメージ
　　　　　qr_img.cgi?d=abcdefg&n=2&m=1&p=48
　　　２つめのイメージ
          qr_img.cgi?d=abcdefg0&n=2&m=2&p=48


４．２．２、コマンドラインモード
　　qr_img.cgiはコマンドラインからも実行できます。
　　引数間は空白で区切ります。
　　引数dでデータを渡す場合はCGI同様データはURLエンコードされている必要があります。
　　例１
　　 $ ./qr_img.cgi d=This+is+a+pen e=L s=3 > qrcode.png

　　標準入力からデータを渡す場合は生データのままでＯＫです。
　　例２
　　 $ ./qr_img.cgi e=H < data.txt > qrcode.png


５、注意事項
　　下記承知の上ご使用ください。
　　（１）このプログラムのマスク判定ルーチンはおそらく規格と異なります。
　　　　（一応JIS X 0510にある図１と付属書８の例の結果とは合うようにし
　　　　　ています。)
　　　　（マスクの選択を誤っても実使用上は問題ないと思いますが。）
　　（２）連結モードは試験的導入です。
　　（３）その他実際の規格と異なる動作をする恐れが多分にあります。
　　　　　使用の際は出力されたシンボルが確実に読めるかのテストを行うことを
　　　　　お勧めします。特にバージョン２９以上のシンボルは作者の手持ちリー
　　　　　ダの性能の都合上検証ができていませんので使用の際は特にご注意願い
　　　　　ます。
　　（４）本プログラムは「のろま」です。大きいバージョンをエンコードする
　　　　　場合はご注意ください。（タイムアウトするかもしれません。）

６、著作権・配布など
　　これらのプログラムの著作権は作者であるY.Swetakeにあります。
　　これらのプログラムはフリーウエアです。もとの著作権表示を変更しなければ
　自由に再配布・改造してもかまいません。

７、免責事項
　　これらのプログラムによって生じるあらゆる損害・不利益について、作者は
　一切責任を負いません。
　　作者はこれらのプログラムに不備があっても、それを訂正する義務を負いま
　せん。

８、その他
　最新版は下記のページからたどれます。
　　http://www.swetake.com/

　ご意見・不具合などあれば下記まで
　　e-mail: swe[あっと]venus.dti.ne.jp
　　[あっと]を適当な記号に書き換えてください。

９、更新履歴
    2013/5/18 ver.0.50j
              ・残余ビット部分が反転していた不具合を修正。
　　　　　　　　本不具合による読み取り精度への影響は皆無と推測されますが、より仕様に合致するための
　　　　　　　　修正となっています。
		(ご指摘くださいました池田様、ありがとうございました。)

    2009/11/10 ver.0.50i
              ・PHP版においてpreg_match関数中の正規表現記載ミスを修正。

    2009/11/8 ver.0.50h
              ・PHP版において、PHP5.3.0から非推奨となったereg関数をpreg_match関数に
　　　　　　　　書き換えた。（なお、以前のereg関数で"-"がうまくマッチせず、エンコード
　　　　　　　　モードの自動判別が誤っていた不具合もpreg_matchに変更することにより解消した。
　　　　　　　・Perl版において念のため正規表現の記述を変更した。[]内の\-を一番最後に書くようにした。
　　　　　　　　なお特に0.50gで問題が起きていなければバージョンアップをする必要はないと思われます。

    2005/7/23 ver.0.50g
              ・特定のパラメータの組み合わせでサーバー上のリソースを過剰に
　　　　　　　　消費する不具合を修正。
              ・バージョンの上限を指定できる変数を追加。

    2005/7/21 ver.0.50f
              ・perl版における引数vのチェックを修正
              ・php版のマスク選択処理を一部変更(thanks for Mr.Bru, Franky)

    2004/7/19 ver.0.50e
              ・php版のalphanumericモードで記号が正しくエンコードできない
                不具合を修正

              ・rsc36.dat rsc52.datの計算間違いを修正。
               (なおこれらのファイルはmodel2では使用しません)

    2003/10/5 ver.0.50d
              ・perl/cgi版htmlモードにて $img_path4html の設定が
              　反映されていない不具合修正

    2003/6/19 ver.0.50c
              ・マスク選択処理一部変更
              ・ドキュメント改定

    2003/5/24 ver.0.50b 
              ・ドキュメントの改定

    2003/4/13 ver.0.50a
              ・ファイルオープン処理の修正(バイナリモード明記)
              ・エラー処理部修正
              ・ドキュメントの改定(GD2.0に関する注記追記)

    2002/9/21 ver.0.50
              ・バージョン1-40対応
              ・処理速度向上のため以下のルーチンを大幅見直し
　　　　　　　　　エラー訂正語生成処理
　　　　　　　　　マスク選択処理　　　　等

    2002/5/26  ver.0.40
              ・連結に試験的に対応（動作・不具合報告歓迎致します。）
　　　　　　　・qr_html.cgi とqr_img.cgiを統合
　　　　　　　　qr_img.cgi の引数t=Hを指定することによりhtml出力とした。
　　　　　　　・PHP版において外部変数の取り込みをsuperグローバル関数による
　　　　　　　　ものに変更した。(デフォルトはGET)
　　　　　　　・マスクの選択機能廃止
　　　　　　　・その他、コードのメンテナンス。

    2002/2/10 ver.0.31
　　　　　　　・jpeg出力に対応

　　2001/4/30 ver.0.30
　　　　　　　・マスク選択ルーチン更新。JIS X 0510の図１および
　　　　　　　　付属書８図２の結果と合うように変更。
　　　　　　　　（これにともないデータファイルの構成変更。）
　　　　　　　・version 1-9 対応。
　　　　　　　・qr_img.cgiのコマンドライン対応

　　2001/3/30 ver.0.20a
　　　　　　　・CGI版にてマスク選択パラメータ処理が不正なため
　　　　　　　・マスクが常に0となっていた不具合を修正。
　　　　　　　・CGI版は任意のマスクパターン選択機能廃止。

    2001/3/9  ver. 0.20
　　　　　　　・version 1-6 対応
　　　　　　　　それに伴いデータ処理・ECCルーチン等大幅変更。

    2001/2/11 ver. 0.10B
　　　　　　　・処理ルーチン更新。処理速度20〜30%up。
　　　　　　　・PHP版追加。

　　2000/9/11 ver. 0.10 公開
　　　　　　　(version1の数字・英数字・8bitモードのみサポート)

[eof]
