プロが教える店舗&オフィスのセキュリティ対策術

perl でクッキーに書き込んだ文字を、JavaScript
で取り出して表示させると文字化けしてしまいます。

name = getCookie("NAME");
document.write(name);

・・・とやると、「 :::‚ ‚¨‚¢‚³‚ñ 」と、
日本語の名前が化けて表示されてしまいます。
アルファベットだと問題がないのですが、
なにか変換のようなものが必要なのでしょうか。

A 回答 (3件)

例示されているクッキーの内容から判断から、おそらくエスケープ前の文字列の文字コードがShift_JIS(もしくはJIS)である、と思われます。


それ以外は標準的なエスケープ処理だと思います。

使用ブラウザを限定するのなら、それに合った対処をすることができます。
汎用にしたい場合、Perl側もJavaScript側も複雑な処理が必要です。
これは、IE4以降およびNetscapeの最近のバージョンは、文字コード絡みの処理をUnicodeで行うように仕様が変更されたためです(ECMA準拠)。
このため、ブラウザの扱うデフォルトの文字コードが何であるかを取得し、それに応じたcookieのエンコードをする必要が生じます。
ちなみに、自前で文字コード変換関数を用意する以外の方法では、%82%74...をJavaScriptでデコードすることはできないはずです。
# Windows+(IE4以降orNetscape6以降)に限定するなら、Perl側の処理を少し変えればできます

従って、考えられる方法のとしては、
1.JavaScriptのデフォルトの文字コードを判定し、cookieにエスケープされない文字で格納しておき、それに応じた処理をする。
それに応じた処理、というのは、perl側でjcode.pmを用いてURLエンコード前に、文字コードを適切に変換する、ということです。
デフォルト文字コードの判定は、適当な2バイト文字をJavaScriptにescape()させ、その結果をみれば可能です。

2.JavaVMを利用する
Javaアプレットでjava.net.URLEncoderを使用します。
しかし、セキュリティーの関係上、クライアントがJavaVMを使用しない設定になっていることも考えられます。

3.Perlでcookieを全てデコードしてJavaScriptの変数に代入するような実行文を出力HTMLに埋め込む
JavaScript側は楽をできますが、できれば避けたい方法です。

参考URL:http://openlab.ring.gr.jp/Jcode/index-j.html
    • good
    • 0
この回答へのお礼

本当にありがとうございました。
プログラミングをまだ初めたての私には、これだけ
詳細に教えていただける事は、なにを差し置いても
ありがたいことです。
とにかく・・・とにかくデコード、エンコードは、
難しいこととがわかりました。
3案のうち自分でできそうな事をいま試している
ところです。
最悪どうしてもだめだったら、cookie 取得、書込み
処理のところを そっくり JavaScript に書き換えよう
と思います。。。
専門家の方にこうまで親身になって教えていただき、
心より感謝いたします。

お礼日時:2002/04/14 18:08

エンコードとデコードの方法が対応していないと思われます。


例示されているエンコードはUnicode系URLエンコードではないので、unescape()ではデコードできません。
HTMLエンコードをしているのなら、それに対応するデコード関数を記述する必要があります。
JavaScriptでも制限付きで正規表現(RegExpオブジェクト)が使用できますので、PerlCGIでデコードに使用している表現を書き換えればOKです。
また、エンコード/デコードのやり方は人によって異なりますので、PerlCGIのデコードルーチンを記述された方が回答が得られやすいかと思います。

なお、上のエンコードは、cookieのルール(;はクッキーの値に現れてはならない)に反しているように思われます。

参考URL:http://www.ietf.org/rfc/rfc2965.txt
    • good
    • 0
この回答へのお礼

礼 ありがとうございました。
先にあげた「」のデコード文字なのですが、
カット&ペーストしたものですが、送信した後に
何故かかわってしまいました。
クッキーにかかれている文字は「 %82%74%82%6D%・・・ 」 という文字です。
一応、そのスクリプトを書いておきますが、
回答は任意で結構です。
1、2日で締め切りたいと思います。

sub setCookie {

local($tmp, $val);

$val = $_[1];
$val =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$tmp = "Set-Cookie: ";
$tmp .= "$_[0]=$val; ";
$tmp .= $cookie_date;


# cookie 書き込み

print $tmp;

return($tmp);

}

お礼日時:2002/04/13 15:44

cookieに保存できる文字には制限がありますので、2バイト文字等を格納したい場合には何らかのエンコードをする必要があります。


CGI側でその処理を行っていない/うまくいっていないためと思われますのでご確認ください。
NetscapeはURLエンコードを推奨しているようです。

参考URL:http://tohoho.wakusei.ne.jp/wwwcook.htm

この回答への補足

回答ありがとうございます。
一般にあるサンプルソースを使用して、クッキーを
書き込んでいるのすが、エンコードは行なわれている
ようです。
ただ、cgi で書き込んだエンコードをJavaScript
で読み込む際に、元に戻せない様子です。
この類はわりとよくある質問かとおもったのですが
CGI ←→ JavaScript のクッキーのやり取りの注意に
ついては、Webを検索しても、ほとんど見当たらなくて
困っています。
すみません、もうちょっと情報を待ってみます。

補足日時:2002/04/12 10:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!