#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe #--------------------------------------------------------------------------------- # 検索文字の文字コード変換Perlスクリプト(Encodeモジュールを使用) # URL:http://sakaguch.com 電子メール:http://sakaguch.com/cgi/postmail/ より送信して下さい。 # ファイル名:URLwordEncode.cgi 2004.06.06 作成:鷹の巣 #--------------------------------------------------------------------------------- # 改版記録: # 2004.06.06 Rev.1.000 初版で公開。 # 2004.06.08 Rev.1.010 文字コードが不明な場合、Webページと同じUTF-8Nコードと # 見なす様にした。 # 2004.07.01 Rev.1.020 検索エンジン対策として、http応答ヘッダを301とした。 $ver = 'URLwordEncode.cgi Rev.1.020(作成:鷹の巣)'; #--------------------------------------------------------------------------------- # 1.用途 # # このPerlスクリプトは、Webページに設置したフォームより送信した文字コードを # 変換して、他のCGIにURL転送します。 # # 使用例 # (1)UTF-8NのWebページに設置した検索フォームより、検索文字を任意のコードに # 変換して検索する。 # (2)UTF-8NのWebページに設置した検索フォームより、他の検索サイトのCGIに # 指定した文字コードで検索文字を出力する。 # # このPerlスクリプトは、フリーソフトです。詳細は、項4をご一読願います。 # #--------------------------------------------------------------------------------- # 2.使用例と特徴 # # 使用例を以下のURLに設置しています。 # http://sakaguch.com/utf1.html # # ○利点:このPerlスクリプトを中継することにより、検索文字列の文字コードを # 統一出来る。 # # ○欠点:中継処理を行う為、応答時間が多少長くなる。 # #--------------------------------------------------------------------------------- # 3.ご注意事項 # # このスクリプトは、Windows 2000 ProfessionalとWindows XP Home Editionの # ActivePerl-5.8.4.810-MSWin32-x86.msi の環境にて動作確認を行っております。 # UTF-8のコード変換は、Perl 5.8の標準の組み込みモジュールで実現しています。 # # UTF-8Nの検索文字列に変換した場合、「-」や「~」等の一部の全角記号は、 # 変換されませんので、ご注意願います。 # # このスクリプトに対するご質問や不具合がございましたら、電子メールで、 # webmaster@sakaguch.com まで、お寄せ下さい。 # また、「鷹の巣」の自宅サーバー掲示板 # http://sakaguch.com/cgi/bbs/ # にご投稿して頂いても結構です。 # #--------------------------------------------------------------------------------- # 4.著作権 # # このスクリプトの一部には、著作権が設定されています。 # 著作権が設定されているスクリプトは、記載のURLの配布規定を遵守して下さい。 # このスクリプトの全体は、鷹の巣が作成しましたが、鷹の巣の作成した部分の著作権は # 放棄しています。スクリプトの再配布や改造は自由ですが、無償として下さい。 # いかなる目的であっても、このスクリプトに付加価値をつけて、 # 有償配布してはなりません。 # #--------------------------------------------------------------------------------- # 5.使用方法(namazuの例) # # WebサーバーのCGI実行パス下(本例では、/cgi-bin/)に本CGIのURLwordEncode.cgiを設置し、 # Webページの検索フォームを下記の2番の様に変更する。 # # 1.文字コードがUTF-8のWebページに下記のフォームを設置すると、 # 検索文字列の文字コードは、UTF-8Nになり、検索出来なくなる。 # #
# # # 2.文字コードがUTF-8のWebページに下記のフォームを設置しても、 # 検索文字列の文字コードは、URLwordEncode.cgiによって、euc-jp(Shift_JIS)になり、検索出来る。 # # # #--------------------------------------------------------------------------------- #--------------------------- #■□■ 基本設定 ■□■ #--------------------------- # 送信先の文字コードの設定 # $SEND_CODE = 'utf8'; # $SEND_CODE = '7bit-jis'; # $SEND_CODE = 'euc-jp'; $SEND_CODE = 'shiftjis'; # Locationヘッダが使えないWebサーバーや案内画面を表示する場合は、1にする。 $FLAGLOCATION = 0; #------------------------------- #■□■ 基本設定の終わり ■□■ #------------------------------- # Guessには、asciiとutf8は初期値として設定済みの為、省略可能。 use Encode::Guess qw/ shiftjis euc-jp 7bit-jis /; use Encode qw/ from_to /; # プログラムの先頭で実行、長くても15秒で終了する # 参考URL-http://www.aka.ne.jp/~deguchi/hobby/iden/cgi.html#timeout alarm(15); $SIG{'ALRM'} = 'kill_process'; # 引数に検索文字列を含んだURIの文字コードの変換を行う。 $newURL = &URI_encode ($SEND_CODE); # URL転送を行なう。 &move_URL ( $newURL , $FLAGLOCATION ); exit; #----------------# # 終了処理 # #----------------# sub kill_process { # …適切な終了処理… exit; } #-----------------------# # URIの文字コード変換 # #-----------------------# sub URI_encode { # 処理:引数に検索文字列を含んだURIの文字コードの変換を行う。 # # 入力:変換する文字コード($query_code) # 出力:出力先のURL($URL)と検索文字列を含んだ引数($query_string) # # KentWebさんのWeb Forumのdecodeサブルーチンを流用。 # 著作権:Copyright (c) KentWeb http://www.kent-web.com/ my ($query_code) = @_; my ($buf, $key, $val ,$URL ,$enc ,$query_string); if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 1200) { exit; } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } foreach (split(/&/, $buf)) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s/</g; $val =~ s/>/>/g; # パイプ記号の無効化など $val =~ s/\0|\|//g; # 改行処理 $val =~ s/\r//g; $val =~ s/\n//g; if ($key eq 'url') { $URL = $val; } else { # 文字コードの変換 if (($key eq 'q') or ($key eq 'query')) { $enc = guess_encoding ( $val ); # UTF8フラグを付けずに文字コードを変換 if ( ref $enc ) { from_to ( $val , $enc->name , $query_code ); } else { # 文字コードが不明な場合、Webページと同じUTF-8Nコードと見なす from_to ( $val , 'utf8' , $query_code ); } } $query_string .= "$key=$val&"; } } # 出力先のURL($URL)と検索文字列を含んだ引数($query_string)を出力する。 return "$URL\?$query_string"; } #---------------# # URL転送 # #---------------# sub move_URL { # 処理:URL転送を行なう。 # # 入力:転送先のURL($to_URL) # Locationヘッダ未使用フラグ($FlagLocation) # 出力:転送先のURLまたは内容を標準出力 # # IISサーバーの場合、CJ-ClubさんのEasyRINGのスクリプトを流用。 # Copyright(C) りゅういち WWW:http://www.cj-c.com/ my ( $to_URL , $FlagLocation ) = @_; # URL転送を行なう。 if ($FlagLocation) { print "Content-type: text/html\n\n"; print <<"HTML";