過去の桐井戸端BBS (桐ver.9)
30859 urlencodeのデータをurldecodeするための計算式はありますか ts 2005/08/10-23:06
tsと申します。
よろしくお願いします。
[環境:桐V9sp2 OS:w2kpro]

 さっそくですが、iisのログを桐に取り込む処理を考えておりますが、
取り込みデータにurlencode("%**" 形式)してあるデータがあり、そのまま取り込んだのでは
何がログとして出力されているかわからないため、これを桐でurldecode(2バイト文字)し
読める形式(項目)にしたいと考えています
が、いろいろ試したのですが、うまくいきませんでした
(項目計算式が上手く出来ませんでした。)。

 本掲示版の諸先輩方々で、良い方法等ご存じの方がいらっしゃいましたら、
ヒント等お知恵を拝借できればと思います。

よろしくお願いいたします。


30867 Re:urldecodeするための項目計算式について hidetake 2005/08/11-06:49
記事番号30859へのコメント
UrlDecode は桐で作った事は無いですけれど UrlEncode は下記にあります。

http://www2u.biglobe.ne.jp/~s_tanaka/cgi-bin/bbs/bbs.cgi?function=logview_html&no=81#4044

ただし、「桐」での話ですので文字コードは Shift_JIS を前提にしてあります。


さて、tsさんは「桐」で UrlDecode をご希望のようですが、文字コードに
関しては、どのようにされるおつもりでしょう?
UrlDecode する文字列の元の(UrlEncodeする前の)文字コードについてですが、
もし Decode した際に、その文字が Shift_JIS であれば「桐」で直接扱えるかも知れませんが、
それ以外の EUC-JP や ISO-2022-JP あるいは
UTF-8 であったら?・・・ 

ログの UrlEncode された元の文字コードは HTTP_REFERER だったら、
元のページの文字コードで飛んでくる場合もあるでしょうが(最初からUrlEncodeされたリンクで飛んできた場合)、
UrlEcode してないリンクや、あるいはご自分のページでも日本語のファイル名がある場合は Mozilla 系は正しい
作法に基づき UTF-8 で Encode してアクセスしてきますので「桐」だと・・・

桐で IIS のログを取り込むという事ですので、これは桐自身では直接は
出来ない事なので、何かのツールや外部スクリプトを使われるはずですが、
その段階で UrlDecode や文字コードの変換は行われた方が良いのでは無いかと思います。
30871 Re:urldecodeするための項目計算式について hidetake 2005/08/11-07:33
記事番号30867へのコメント
>桐で IIS のログを取り込むという事ですので、これは桐自身では直接は
>出来ない事なので、何かのツールや外部スクリプトを使われるはずですが、

これは現在の状態のログも含めて持ってくる場合の事ですけれど、過去の分
(昨日以前)だけを対象にしていれば「桐」でも可能ですね。 (^^;
いずれにせよ取り込む前の段階でフィルタを通した方が・・・
30876 Re:urldecodeするための項目計算式について hidetake 2005/08/11-11:22
記事番号30871へのコメント
>いずれにせよ取り込む前の段階でフィルタを通した方が・・・

まぁ〜無理矢理「桐」でやるとして、文字コードが Shift_JIS 前提で
あれば次のような感じでいけるかな!? ざっと書いたので汚いけど :-)

proc UrlDecode(str &Source, refer str &Result)
cond (.not&Source) Return
var long {&SourceLength, &i, &Hex}
var str {&Str, &Str1, &Str2, &Str3, &Str4, &dStr}
&SourceLength = #l(&Source), &Result=#u
for &i = 1, &SourceLength, 1
&Str = #sstr(&Source, &i, 1)
if (&Str = "+")
&Result = &Result + " "
else if ((&Str = "%") .and (&i+2 =< &SourceLength))
&Str1 = #sstr(&Source, &i+1, 1) \
,&Str2 = #sstr(&Source, &i+2, 1)
&Hex = #h(&Str1+&Str2)
if ( (#h("00") <= &Hex .and &Hex <= #h("80")) \
.or (#h("A0") <= &Hex .and &Hex <= #h("DF")))
&dStr=#sj(&Hex)
&Result = &Result + &dStr
&i = &i + 2
else if ( (#h("81") <= &Hex .and &Hex <= #h("9F")) \
.or (#h("E0") <= &Hex .and &Hex <= #h("FF")))
if ( &i+5 =< &SourceLength \
.and #sstr(&Source, &i+3, 1) = "%")
&Str3 = #sstr(&Source, &i+4, 1) \
,&Str4 = #sstr(&Source, &i+5, 1)
&Hex = #h(&Str1+&Str2+&Str3+&Str4)
&dStr=#sj(&Hex)
&Result = &Result + &dStr
&i = &i + 5
else if (&i+3 =< &SourceLength)
&Str3 = #str(#h(#sj(#sstr(&Source, &i+3, 1))))
&Hex = #h(&Str1+&Str2+&Str3)
&dStr=#sj(&Hex)
&Result = &Result + &dStr
&i = &i + 3
else
&Result = &Result + &Str + &Str1 + &Str2
&i = &i + 2
end
else
&Result = &Result + &Str + &Str1 + &Str2
&i = &i + 2
end
else
&Result = &Result + &Str
end /* if */
end /* for */
end /*UrlDecode*/

30877 Re:urldecodeするための項目計算式について hidetake 2005/08/11-11:36
記事番号30876へのコメント
> UrlDecode

URLエンコードする際に、たとえば「URLエンコード」と言う文字列を
Shift_JIS で UrlEncode する場合も(Shift_JIS を使う場合は!)

URL%83%47%83%93%83%52%81%5B%83%68
と変換するものもあれば

URL%83G%83%93%83R%81%5B%83h
と変換するものもあり

デコードする際はこの両方のパターンにも対応しないといけないなど
面倒ですよね! :-)
30880 Re:urldecodeするための項目計算式について うにん 2005/08/11-12:55
記事番号30867へのコメント

>桐で IIS のログを取り込むという事ですので、これは桐自身では直接は
>出来ない事なので、何かのツールや外部スクリプトを使われるはずですが、
>その段階で UrlDecode や文字コードの変換は行われた方が良いのでは無い
>かと思います。

Log Parserというのがあるようです。
http://www.microsoft.com/downloads/thankyou.aspx?familyId=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displayLang=ja

30881 Re:urldecodeするための項目計算式について hidetake 2005/08/11-14:21
記事番号30876へのコメント
>proc UrlDecode(str &Source, refer str &Result)

「桐井戸端BBSを補完するために」の #183 にサンプルをあげておきました。
http://www.fuku3.com/~habata/cgi-bin/bbs1/clip.cgi
http://www.fuku3.com/~habata/cgi-bin/bbs1/img/183.lzh

30886 Re:urldecodeするための項目計算式について ts 2005/08/11-21:32
記事番号30880へのコメント
hidetake 様
うにん 様

res いただき有難うございます。

>>hidetake 様

183.lzh 有難うございます。
さっそく、試してみます。
有難うございました。

>>うにん 様

Log Parserの情報有難うございました。
このようなソフトが。MSより出ているとは知りませんでした。
貴重な情報提供有難うございました。


戻る