#!/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/\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"; 301 Moved Permanently Move to: $to_URL HTML }else{ if( $ENV{PERLXS} eq "PerlIS" ) { # IISサーバーの場合 print "HTTP/1.0 302 Temporary Redirection\r\n"; } else { print "Status: 301 Moved Permanently\n"; } print "Content-type: text/html\n"; print "Location: $to_URL\n\n"; } }