漢字クッキーをJavaScriptでSetしPerlでGetする!

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

■ 漢字クッキーをJavaScriptでSetしPerlでGetする!

クッキー出力で、IEのJavaScriptで漢字コードをescapeすると%uのあとにutf16be(4文字でビックエンディアン)になります。

尚、このURLエンコードですが、これは標準仕様でなく、MSの独自仕様です。

このクッキーをCGI(Perl)でデコードしてSJISにするサブルーチン(GetCookieForJavaScript)を作ってみました。


JavaScriptクッキー書き込みHTMLサンプル
<html>
<script type="text/javascript">
function SetCookie(){
         SetCookie.put = function(name ,data ,limit, domain, path) {
             var date = ''; 
             var wkdomain = ''; 
             var wkpath = ''; 
             if (limit) {
                 today = new Date();
                 today.setTime(today.getTime()+1000*60*60*24*limit);
                 date = ';expires='+today.toGMTString();
             }
             if (domain != '') {
                wkdomain='domain=' + domain + ';';
             }
             if(path != '') {
                wkpath='path=' + path + ';';
             }
             document.cookie = name + '=' + escape(data) + date + wkdomain + wkpath;
        }
}
new SetCookie();
//SetCookie.put:クッキー設定メソッド
//第1引数:クッキー名
//第2引数:データ(漢字OK)
//第3引数:有効期限(日にち単位で指定)
//第4引数:ドメインの値
//第5引数:パスの値
SetCookie.put("TEST_COOKIE","DATA1:1111あ,DATA2:やaaaす",1, "localhost", "/cgi-bin/");
</script>
<body>
<p><a href="../cgi-bin/cookie.cgi">クッキーテスト</a></p>
</body>
</html>


JavaScriptクッキー読み込みCGIプログラムサンプル
#!/usr/bin/perl -w
use strict;

my %COOKIE = &GetCookieForJavaScript("TEST_COOKIE");

print "Content-type: text/html; charset=Shift_JIS", "\n\n";
print <<"EOH";
<html>
<body>
<p>DATA1:$COOKIE{"DATA1"},DATA2:$COOKIE{"DATA2"}</p>
</body>
</html>
EOH

# クッキー取得サブ
sub GetCookieForJavaScript {
    my ($CookieName) = @_;
    my (%DUMMY, %COOKIE, $name, $value);
    my $cookies = $ENV{'HTTP_COOKIE'};
    my @pairs = split(/;/, $cookies);
    foreach my $pairs (@pairs) {
        $pairs =~ tr/+/ /; # URLでコード
        $pairs =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2', $1)/eg; # URLでコード
       ($name, $value) = split(/=/, $pairs);
        $name =~ s/ //g;
        $DUMMY{$name} = $value;
        #debug($value);
    }
    @pairs = split(/,/, $DUMMY{"$CookieName"});
    foreach my $pairs (@pairs) {
        ($name, $value) = split(/:/, $pairs);
        $COOKIE{chgU2S($name)} = chgU2S($value);
    }
    return %COOKIE;
}

# ユニコード(utf16be)からシフトJIS(shiftjis)への変換サブ
sub chgU2S {
use Encode qw(from_to);
    my ($value) = @_;
    my $offset = 0;
    my $chgvalue = "";
    for (my $i = 0; $i < length($value); $i++) {
        my $wk = substr($value, $offset, 1);
        if (($wk eq "%") && (substr($value, $offset+1, 1) eq "u")) {
           $wk = pack('H4', substr($value, $offset+2, 4));
           from_to($wk, 'utf16be', 'shiftjis');
           $chgvalue  = $chgvalue . $wk;
           $offset = $offset + 6;
        }
        else {
           $chgvalue  = $chgvalue . $wk;
           $offset++;
        }
    }
    return $chgvalue;
}

補足:

クッキーは、セットしたドメイン&パスのところでしか、ゲットできません。

つまり、セットしたドメイン&パスとCGIが動くドメイン&パスが一致していなければなりません。

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう