#!/usr/local/bin/perl
# ↑ Perl処理系のパスを指定。不明な場合はプロバイダかサーバー管理者に確認。
# WEBサイト アクセス解析ソフト (ログ取得用)
# [アクセス・トラッカー]
# - Version 2.01 / Apr 28, 2004 / Freesoft
# - Copyright(C)2004 WEB POWER. All Rights Reserved.
# - 最新版・最新情報は
# <<注意事項>>
# * 数字以外は''内に記述します。'を入れたい場合は 中の'は \'にしてください。
# ex) × $var = value; → ○ $var = 'value';
# ex) × $var = 'I can't'; → ○ $var = 'I can\'t';
# * $ # ; ' 等の記号は間違って消さないように注意してください。
# * 1文字のミスでもプログラムは動きません。設定・編集は慎重にしましょう。
# * 行の頭に"#"を付けると、その行は無効になります。(コメントアウト)
# * 値を設定しない場合は、''かコメントアウトしてください。
# ex) × $var = ; → ○ $var = '';
# * 初期設定以外の部分を1バイトでも変更した場合の動作保証は一切しません。
# * 詳しくは本サイトの解説/FAQ等を参照してください。
# * 漢字コードは自動認識ですが、携帯電話で使う場合は"SHIFT_JIS"専用です。
# * ●は必須設定項目です。必ず設定してください。
# * ◎は確認必要項目です。サーバー環境によっては変更が必要です。
# * ○は任意設定項目です。必要に応じて設定してください。
#-------- 特定機能の使用に関する設定 ------------------------------------------
#
# ◎印はサーバー環境によっては正常に動作しない場合があります。
# その場合は、その機能を無効にしてください。
# ○ ログの最大保持数 (あまり大きくしない)
$max = 5000;
$dmax = 90; # ○ 日付別ログの最大保持日数(あまり大きくしない)
$days = 60; # ○ クッキーの有効日数(再訪問として扱う日数)
$hold = 30; # ○ 重複記録防止のためのIPアドレス保持数
# * 0 にするとページビューで解析されます。
$plus = 0; # ○ 累計値にプラスする数値 (カウンター使用時のみ)
$uvst = 0; # ○ ユニークビジターのみを解析(1:する/0:しない)
# * 同一者は1日に1回しかカウントしない
# ($holdを有効にしている必要があります)
$lock = 2; # ◎ ファイルロック(1:使う/2:使う/0:使わない)
$cchek = 0; # ○ ブラウザクッキーサポート確認(1:する/0:しない)
# * 解析ページに確認用HTMLを記述する必要があります。
# ○ クッキーの名前 (通常変更不要)
$cname = 'cookie';
#---<パス/URLの設定>------------------------------------------------------------
#
# ・ パスとはサーバー内での場所です。httpで始まるURIとは違うものです。
# ・ 相対パスとはスクリプトの場所を基準としたパスの指定です。
# ../ => 1つ上のディレクトリ ./ => 同じディレクトリ
# ・ 絶対パスとはサーバー内の一番上のディレクトリを基準としたパスの指定です。
# /usr/lib/sendmail /home/foo/public_html/cgi-bin/script.cgi
# ・ 仮想アドレスとはURIの一部分(ドメイン名以降)を指します。
# http://www.domain.com/~foo/cgi-bin/script.cgi
# ^ ドメイン名の後のスラッシュ"/"以降の部分
# (/~foo/cgi-bin/script.cgi のこと)
# ◎ ライブラリ(stdio.pl)の[パス]
require './stdio.pl';
# ◎ ライブラリ(jcode.pl)の[パス]
require './jcode.pl';
# ◎ ライブラリ(gifcat.pl)の[パス]
# * アクセスカウンターを使う場合のみ必要。使わない場合はコメントアウト。
#require 'gifcat.pl';
# ○ ログファイル格納用のディレクトリのパス
$datadir = './data/';
# ○ エラーファイルの名前 (通常変更不要)
$errname = './errors.txt';
# ○ あなたのサイトのトップディレクトリのURL (外部からの不正利用を防止する場合)
# * http://..で指定する (例:'http://www.bar.ne.jp/~foo/')
$site = 'http://www.dome-sss.com/jcah/';
#───────────────────────────────────────#
# 初期設定ここまで (以下1バイトでも変更した場合の動作保証&サポートは一切なし) #
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━#
# ソースコードの文字コード認識
if (ord "漢" == 0xb4 || ord "漢" == -76) {
$jcode = "euc";
#$JCODE2 = "EUC-JP";
#$CHARSET = "; charset=EUC-JP";
} elsif (ord "漢" == 0x8a || ord "漢" == -118) {
$jcode = "sjis";
#$JCODE2 = "Shift_JIS";
#$CHARSET = "; charset=Shift_JIS";
} elsif (ord "漢" == 0x1b) {
$jcode = "jis";
#$JCODE2 = "ISO-2022-JP";
#$CHARSET = "; charset=ISO-2022-JP";
}
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";
%FORM = stdio::QueryString(1,2);
#/*--- エラーチェック ---*/
if ($ENV{'HTTP_REFERER'} !~ /$site/ && $site) { Errors(); }
elsif (!$FORM{'file'}) { Errors('システムエラー','ファイル名が指定されていません。'); }
#/*--- ファイル名の設定 ---*/
$FORM{'file'} = substr $FORM{'file'}, 0, 64;
$FORM{'file'} =~ s/(^\/|\.\.\/)//g;
$FORM{'file'} =~ s/\//-_-/g;
$datafile = $datadir . $FORM{'file'} . ".acs";
$addrfile = $datadir . $FORM{'file'} . '.adr';
$cook = stdio::SetTime('ww2, dd-mm2-yyyy 23:59:59 GMT') if ($uvst);
$date = stdio::SetTime('yyyy/mm/dd (ww) hh:nn:ss');
$now = $date;
#/*--- 比較用日付の調整 ---*/
($tday,$week,$time) = split(/ /, $date);
$week =~ s/(\(|\))//g;
($time) = (split(/:/, $time))[0];
($year,$month) = split(/\//, $tday);
$month = $year . '/' . $month;
#/*--- 環境変数の設定 ---*/
if ($ENV{'REMOTE_HOST'} eq $ENV{'REMOTE_ADDR'} || !$ENV{'REMOTE_HOST'}) {
$ENV{'REMOTE_HOST'} = $ENV{'REMOTE_ADDR'} if (!$ENV{'REMOTE_HOST'});
$ENV{'REMOTE_HOST'} = gethostbyaddr(pack('C4',split(/\./,$ENV{'REMOTE_HOST'})),2) || $ENV{'REMOTE_ADDR'};
}
$host = $ENV{'REMOTE_HOST'};
$USER_AGENT = substr $ENV{'HTTP_USER_AGENT'}, 0, 256;
$USER_AGENT =~ tr/<>"&\a\b\t/()'-/d;
#/*--- IPアドレスの記録 ---*/
if ($hold) {
@ADDR = stdio::ReadFile($addrfile);
if ($ADDR[0]) {
foreach (@ADDR) {
$ip = $_;
chomp($ip);
if ($ip eq $ENV{'REMOTE_ADDR'}) {
$no_count = 1;
last;
}
}
} else {
shift(@ADDR);
}
if (!$no_count) {
unshift(@ADDR, "$ENV{'REMOTE_ADDR'}\n");
splice(@ADDR, $hold) if ($#ADDR >= $hold);
if (open(FILE,">$addrfile")) {
print FILE @ADDR;
close(FILE);
}
}
}
if (!$FORM{'jump'}) {
$FORM{'link'} = $FORM{'ref'} if ($FORM{'ref'} ne "");
$FORM{'link'} = substr $FORM{'link'}, 0, 256;
$FORM{'link'} =~ tr/ /+/;
$FORM{'link'} =~ s/<//g;
$FORM{'link'} =~ s/"/"/g;
$FORM{'link'} =~ s/&/&/g;
$link = $link2 = $FORM{'link'};
$link =~ s/(.*)\?.*/$1?/i;
#/*--- サーチエンジンの判別 ---*/
if ($link eq 'http://search.yahoo.co.jp/bin/search?' || $link eq 'http://google.yahoo.co.jp/bin/query?' || $link eq 'http://search.yahoo.com/bin/search?' || $link eq 'http://search.yahoo.co.jp/bin/query?') {
$sname = 'p';
} elsif ($link eq 'http://www.infoseek.co.jp/Titles?' || $link eq 'http://japan.infoseek.com/Titles?') {
$sname = 'qt';
} elsif ($link eq 'http://www.goo.ne.jp/default.asp?') {
$sname = 'MT';
} elsif ($link eq 'http://www.excite.co.jp/search.gw?' || $link eq 'http://jp.excite.com/search.gw?') {
$sname = 's';
} elsif ($link eq 'http://www.lycos.co.jp/cgi-bin/pursuit?') {
$sname = 'query';
} elsif ($link eq 'http://search.netplaza.biglobe.ne.jp/cgi-bin/search-renew3.cgi?') {
$sname = 'key';
} elsif ($link eq 'http://search.fresheye.com/?') {
$sname = 'kw';
} elsif ($link eq 'http://para.cab.infoweb.ne.jp/cgi-bin/para?') {
$sname = 'Querystring';
} elsif ($link eq 'http://kaze.csj.co.jp/search/lookup-main.cgi?') {
$sname = 'key';
} elsif ($link eq 'http://www.altavista.com/cgi-bin/query?' || $link eq 'http://www.google.com/search?' || $link eq 'http://www.google.co.jp/search?') {
$sname = 'q';
} elsif ($link eq 'http://search.msn.co.jp/spresults.aspx?') {
$sname = 'q';
$unicode = 1;
} else {
$cant_get_key = 1;
}
#/*--- キーワードの取得 ---*/
if (!$cant_get_key) {
my($q) = $FORM{'ref'} ne "" ? $link2 : $ENV{'QUERY_STRING'};
my($trash, $key) = split(/\?/, $q);
my(@KEY) = split(/&/, $key);
foreach (@KEY) {
if ($_ eq 'oe=UTF-8' || $_ eq 'ie=UTF-8') {
$unicode = 1;
}
($name,$value) = split(/=/, $_);
if ($name eq $sname) {
$keyword = $value;
}
}
# キーワードデコード
if ($keyword) {
$keyword =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$keyword =~ tr/+/ /;
$keyword =~ s/&/&/g;
$keyword =~ s/"/"/g;
$keyword =~ s/</g;
$keyword =~ s/>/>/g;
# UTF-8をSHIFT_JISに変換
if ($unicode) {
$keyword =~ s/([\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf])/utf($1)/eg;
}
jcode::convert(*keyword, $jcode) if ($jcode);
}
}
} else {
$link = $link2 = substr $FORM{'link'}, 0, 256;;
}
#/*--- 個別クッキー1 (前回訪問日時記録用) ---*/
%COOKIE1 = stdio::GetCookie("$cname.1.$FORM{'file'}");
#/*--- 個別クッキー2 (重複記録防止用) ---*/
%COOKIE2 = stdio::GetCookie("$cname.2.$FORM{'file'}");
#/*--- 共通クッキー1 (移動状況把握用) ---*/
%COOKIE3 = stdio::GetCookie($cname);
#/*--- 共通クッキー2 (クッキーサポート確認用) ---*/
%COOKIE4 = stdio::GetCookie('CookieStatus');
$repeat = $check = 0;
$COOKIE4{'cookie_status'} = 1 if(!$cchek);
#/*--- クッキーサポートのチェック ---*/
$check = -1 if (!$COOKIE4{'cookie_status'} && $cchek);
$COOKIE2{'NoCount'} = 1 if ($FORM{'type'} eq 'today' || $FORM{'type'} eq 'ysday');
if (!$COOKIE2{'NoCount'}) {
#/*--- 閲覧ページ数の設定 ---*/
$pages = $COOKIE3{'pages'} + 1 if ($COOKIE3{'pages'} && $COOKIE3{'pages'} > 0 && $COOKIE3{'pages'} =~ /^\d{1,3}$/);
#/*--- 前回訪問日の取得 ---*/
$check = $COOKIE1{'repeat'} if ($COOKIE1{'repeat'} =~ /^\d{4}\/\d{2}\/\d{2} .. \d{2}:\d{2}$/ || $COOKIE1{'repeat'} =~ /^\d{4}\/\d{2}\/\d{2} \(..\) \d{2}:\d{2}:\d{2}$/);
if ($COOKIE1{'revisit'} && $COOKIE1{'revisit'} > 0 && $COOKIE1{'revisit'} =~ /^\d{1,4}$/) {
$COOKIE1{'revisit'} ++;
} else {
$COOKIE1{'revisit'} = 1;
}
} else {
$pages = $COOKIE3{'pages'};
$no_count = 1;
}
#/*--- セッション内はカウントしない ---*/
if (!$no_count) {
#/*--- ロックのチェック ---*/
if (!stdio::LockCheck($datafile,$lock)) { exit(1); }
#/*--- ファイルリード ---*/
@FILE = stdio::ReadFile($datafile);
($urls) = split(/\?/, $ENV{'HTTP_REFERER'});
#/*--- ファイルが空の場合 ---*/
if (!$FILE[1]) {
$FILE[0] = "0\t0\t0\t0\t$tday\t$urls\t$now";
$FILE[2] = "日:0|0|0:0|0|0\t月:0|0|0:0|0|0\t火:0|0|0:0|0|0\t水:0|0|0:0|0|0\t木:0|0|0:0|0|0\t金:0|0|0:0|0|0\t土:0|0|0:0|0|0\t$tday";
$FILE[3] = "0:0|0|0:0|0|0\t1:0|0|0:0|0|0\t2:0|0|0:0|0|0\t3:0|0|0:0|0|0\t4:0|0|0:0|0|0\t5:0|0|0:0|0|0\t"
. "6:0|0|0:0|0|0\t7:0|0|0:0|0|0\t8:0|0|0:0|0|0\t9:0|0|0:0|0|0\t10:0|0|0:0|0|0\t11:0|0|0:0|0|0\t"
. "12:0|0|0:0|0|0\t13:0|0|0:0|0|0\t14:0|0|0:0|0|0\t15:0|0|0:0|0|0\t16:0|0|0:0|0|0\t17:0|0|0:0|0|0\t"
. "18:0|0|0:0|0|0\t19:0|0|0:0|0|0\t20:0|0|0:0|0|0\t21:0|0|0:0|0|0\t22:0|0|0:0|0|0\t23:0|0|0:0|0|0";
$FILE[4] = "$month:0:0";
$first = 1;
} else {
chomp($FILE[0]);
chomp($FILE[1]);
chomp($FILE[2]);
chomp($FILE[3]);
chomp($FILE[4]);
}
#/*--- 総合ログの集計 ---*/
($count,$tocnt,$yscnt,$rept,$today,$url,$now) = split("\t", $FILE[0]);
$count ++;
if ($today ne $tday) {
$yscnt = $tocnt;
$tocnt = 1;
} else {
$tocnt ++;
}
$url = $urls if ($urls);
$rept ++ if ($check && $check != -1);
$data = "$count\t$tocnt\t$yscnt\t$rept\t$tday\t$url\t$now\n";
#/*--- 日付別ログの集計 ---*/
$i = $find = 0;
@DAILY_LOG = split("\t", $FILE[1]);
if ($tocnt != 1 && $FILE[1]) {
foreach (@DAILY_LOG) {
($type,$visit,$repeat) = split(/:/, $_);
if ($tday eq $type) {
$visit ++;
$repeat++ if ($check && $check != -1);
$find = 1;
last;
}
$i ++;
}
$new_log = "$type:$visit:$repeat";
splice(@DAILY_LOG, $i, 1, $new_log);
} else {
$repeat = 1 if ($check && $check != -1);
$new_log = "$tday:1:$repeat";
unshift(@DAILY_LOG, $new_log);
splice(@DAILY_LOG, $dmax) if ($#DAILY_LOG > $dmax);
}
$daily_log = join("\t", @DAILY_LOG);
$daily_log .= "\n" if ($daily_log !~ /\n$/);
#/*--- 週別ログの集計 ---*/
$i = $find = 0;
@WEEKLY_LOG = split("\t", $FILE[2]);
$fin = pop(@WEEKLY_LOG);
foreach (@WEEKLY_LOG) {
last if (!$_);
($type,$visit,$repeat) = split(/:/, $_);
if ($week eq '日' && $fin ne $tday) {
($visit1,$visit2,$visit3) = split(/\|/, $visit);
($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat);
$visit3 = $visit2;
$repeat3 = $repeat2;
$visit2 = $repeat2 = 0;
if ($week eq $type) {
$visit1 ++;
$visit2 ++;
$repeat1 ++ if ($check && $check != -1);
$repeat2 ++ if ($check && $check != -1);
}
$visit = "$visit1|$visit2|$visit3";
$repeat = "$repeat1|$repeat2|$repeat3";
$WEEKLY_LOG2[$i] = "$type:$visit:$repeat";
} elsif ($week eq $type) {
($visit1,$visit2,$visit3) = split(/\|/, $visit);
($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat);
$visit1 ++;
$repeat1 ++ if ($check && $check != -1);
$visit2 ++;
$repeat2 ++ if ($check && $check != -1);
$visit = "$visit1|$visit2|$visit3";
$repeat = "$repeat1|$repeat2|$repeat3";
$find = 1;
push(@WEEKLY_LOG, $tday);
last;
}
$i ++;
}
if ($find) {
$new_log = "$type:$visit:$repeat";
splice(@WEEKLY_LOG, $i, 1, $new_log);
} elsif (@WEEKLY_LOG2) {
push(@WEEKLY_LOG2, $tday);
@WEEKLY_LOG = @WEEKLY_LOG2;
} else {
Errors('ログエラー','曜日別アクセスのログが破損しています。');
}
$weekly_log = join("\t", @WEEKLY_LOG);
$weekly_log .= "\n" if ($weekly_log !~ /\n$/);
#/*--- 時間別ログの集計 ---*/
$i = $find = 0;
@HOUR_LOG = split("\t", $FILE[3]);
if ($tocnt == 1 && !$first) {
foreach (@HOUR_LOG) {
($type,$visit,$repeat) = split(/:/, $_);
($visit1,$visit2,$visit3) = split(/\|/, $visit);
($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat);
$visit3 = $visit2;
$repeat3 = $repeat2;
$repeat2 = $visit2 = 0;
$visit = "$visit1|$visit2|$visit3";
$repeat = "$repeat1|$repeat2|$repeat3";
$NEW_HOUR_LOG[$i] = "$type:$visit:$repeat";
$i ++;
}
@HOUR_LOG = @NEW_HOUR_LOG;
}
$i = 0;
foreach (@HOUR_LOG) {
($type,$visit,$repeat) = split(/:/, $_);
($visit1,$visit2,$visit3) = split(/\|/, $visit);
($repeat1,$repeat2,$repeat3) = split(/\|/, $repeat);
if ($time == $type) {
$visit1 ++;
$repeat1 ++ if ($check && $check != -1);
$visit2 ++;
$repeat2 ++ if ($check && $check != -1);
$visit = "$visit1|$visit2|$visit3";
$repeat = "$repeat1|$repeat2|$repeat3";
$find = 1;
last;
}
$i ++;
}
if (!$find) { Errors('ログエラー','時間帯別アクセスのログが破損しています。'); }
$new_log = "$type:$visit:$repeat";
splice(@HOUR_LOG, $i, 1, $new_log);
$hour_log = join("\t", @HOUR_LOG);
$hour_log .= "\n" if ($hour_log !~ /\n$/);
#/*--- 月間別ログの集計 ---*/
$i = $find = 0;
@MONTHLY_LOG = split("\t", $FILE[4]);
($type,$visit,$repeat) = split(/:/, $MONTHLY_LOG[$#MONTHLY_LOG]);
if ($type eq $month) {
$visit ++;
$repeat++ if ($check && $check != -1);
$MONTHLY_LOG[$#MONTHLY_LOG] = "$month:$visit:$repeat";
} else {
$repeat = 0;
$repeat = 1 if ($check && $check != -1);
$new_log = "$month:1:$repeat";
push(@MONTHLY_LOG, $new_log);
}
$monthly_log = join("\t", @MONTHLY_LOG);
$monthly_log .= "\n" if ($monthly_log !~ /\n$/);
$FORM{'screen'} = "" if ($FORM{'screen'} !~ /^\d{3,4}\*\d{3,4}$/);
$FORM{'color'} = "" if ($FORM{'color'} !~ /^\d{1,2}$/);
#/*--- 個別ログの集計 ---*/
$logs = "$date\t$host\t$link2\t$USER_AGENT\t$keyword\t$check\t$COOKIE1{'revisit'}\t$pages\t$FORM{'screen'}\t$FORM{'color'}\n";
#/*--- 配列をシフト ---*/
for (1 .. 5) { shift(@FILE); }
#/*--- 古いログを削除 ---*/
if ($max < $#FILE) {
splice(@FILE, $max);
}
#/*--- レコードの統括 ---*/
unshift(@FILE, $logs);
unshift(@FILE, $monthly_log);
unshift(@FILE, $hour_log);
unshift(@FILE, $weekly_log);
unshift(@FILE, $daily_log);
unshift(@FILE, $data);
#/*--- ロックのチェック ---*/
if (!stdio::LockCheck($datafile,$lock)) { Error(); }
#/*--- ファイルのロック/入出力 ---*/
$locked = stdio::FileLock($datafile,$lock,@FILE);
if ($locked == -1) { Errors('システムエラー','このサーバーではシンボリックリンクが使えません。'); }
elsif (!$locked) { Errors(); }
#/*--- カウンターを表示する ---*/
} elsif ($FORM{'type'}) {
#/*--- ファイルリード ---*/
if (open(FILE,$datafile)) {
$count_data = ;
close(FILE);
}
($count,$tocnt,$yscnt) = split("\t", $count_data);
}
$pages = 1 if (!$pages);
$date =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
# レスポンスヘッダー出力
if ($FORM{'jump'}) {
print "Location: $FORM{'link'}\n" ;
} else {
print "Content-Type: image/gif\n";
}
# クッキー発行
stdio::SetCookie("$cname.1.$FORM{'file'}","repeat:$date&revisit:$COOKIE1{'revisit'}",$days);
stdio::SetCookie("$cname.2.$FORM{'file'}","NoCount:1",$cook) if($hold);
stdio::SetCookie($cname,"pages:$pages","");
print "\n";
exit if ($FORM{'jump'});
binmode STDOUT;
# カウンター数字表示
if ($FORM{'type'}) {
if ($FORM{'type'} eq 'today') {
$count = $tocnt;
} elsif ($FORM{'type'} eq 'ysday') {
$count = $yscnt;
} elsif ($FORM{'type'} eq 'revst') {
$count = $COOKIE1{'revisit'};
} else {
$count += $plus;
}
&PrintCounter($count,$FORM{'fig'},$FORM{'img'}) if (-d $FORM{'img'});
}
# 代替画像を表示
if ($FORM{'img'} !~ /(^\/|\.\.\/\.\.\/\.\.\/)/ && -e $FORM{'img'}) {
if (open IN, $FORM{'img'}) {
my($buf);
binmode IN;
while (read IN, $buf, 1024) {
print $buf;
}
close IN;
}
}
# クリアGIF画像表示
my(@image_hex) = qw(47 49 46 38 39 61 01 00 01 00 91 ff 00 ff ff ff 00 00 00 c0 c0 c0 00 00 00
21 f9 04 01 00 00 02 00 2c 00 00 00 00 01 00 01 00 40 02 02 54 01 00 3b);
foreach (@image_hex) {
my($data) = pack('C*', hex($_));
print $data;
}
exit;
#/*------------------- カウンターを表示する -----------------------------------------*/
sub PrintCounter
{
my($count, $fig, $imgdir) = @_;
my(@img);
return if ($FORM{'img'} =~ /(^\/|\.\.\/\.\.\/\.\.\/)/);
$count = 0 if (!$count || $count =~ /\D/);
$count = sprintf("%0$fig"."d",$count) if ($fig > 2 && $fig < 12);
foreach (split(//, $count)) {
push @img, "$imgdir/$_.gif";
}
print gifcat::gifcat(@img);
exit;
}
# ユニコード変換
sub utf #($str)
{
my($str) = $_[0];
my(@list, $code);
&load_table("utf8", "sjis");
$str =~ s/(.)/$code.=sprintf("%0X", ord $1)/eg;
if ($CODE{$code} =~ /([0-9A-F]{2})([0-9A-F]{2})?([0-9A-F]{2})?/) {
$list[0] = hex $1;
$list[1] = hex $2 if ($2 ne "");
$list[2] = hex $3 if ($3 ne "");
}
return pack("C*", @list);
}
# UNICODE⇔UTF8⇔SHIFT_JIS⇔EUC-JP 変換テーブルをロード
sub load_table #($key, $val)
{
# →仮引数
my($key, $val) = @_;
# ! 局所変数宣言
my(%code) = (
'sjis' => 0,
'euc' => 1,
'unicode' => 2,
'utf8' => 3
);
$key = $code{$key};
$val = $code{$val};
return if ($load || $key eq "" || $val eq "");
return if (!open IN, "unicode.txt");
while () {
tr/\r\n//d;
my(@code) = split / +/;
$CODE{$code[$key]} = $code[$val];
}
close IN;
$load = 1;
return;
}
#/*------------------- エラー発生時の処理 -------------------------------------------*/
sub Errors {
$errfile = $datadir . $errname;
if ($_[0]) {
if (open(FILE,">>$errfile")) {
print FILE "$now,$_[0],$_[1]\n";
close(FILE);
}
}
if ($_[0] ne 'ログエラー') {
print "Content-type: image/gif\n\n";
stdio::FileOutput($FORM{'img'});
exit(1);
}
}
sub sigexit {
if (-e $stdio::lockfile) { unlink($stdio::lockfile); }
if (-e $stdio::tempfile) { unlink($stdio::tempfile); }
exit(0);
}