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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q&= ~0x0c; &= ~0x03; |=1;

JavaScriptで分からないコードがあるので教えてください。


■変数設定
var hoge = 0;


■変数格納
・キーを押した時の条件分岐
  ~なら hoge |= 1;
  または hoge |= 2;
  または hoge |= 3;
  または hoge |= 8;

・キーを離した時の条件分岐
  ~なら hoge &= ~0x0c;
  または hoge &= ~0x03;


■変数使用
・swithch文の条件分岐に利用
  (hoge&0x03)
  (hoge&0x0c)


■質問
・どういう意味でしょうか?
・文字コード?
・ビット演算?

Aベストアンサー

ビット演算してるわね

x = x + a

x += a
って書くことができるの

つまり
hoge |= 1

hoge = hoge | 1
のことね

~はNOTのこと

0x
はアスキーコードの16進数表記ねきっと

0x0c は改ページを意味していて
0x03 は文章の最後を意味している
と思われるわ
全文がないので推測だけど

Qdocument.writeをinput type="text"の value値に

超初心者です。
下記の式にてPHPよりjavascriptにてHTMLに書き出しできましたが
<script type="text/javascript" src="./jsphptest.php?long=3" ></script>この値をHTMLのinput type="text"の value値にデフォルトとして入れたいと思っていますが、どうすればできるのか分かりません。できればボタン等を介さずページをロードすればこPHPからjavascriptのdocument.write値がvalue値に入って欲しいと思っています。簡単なようで難しいことなのでしょうか?どうかご教授よろしくお願いいたします。

Aベストアンサー

それからどうでもいいけど
htmlのタグの順番が適当ですね。

Q外部JavaScriptでのdocument.writeについて

今、JavaScriptを使ってHPを作ろうと思っています。
そこで、外部ファイルとしてJavaScriptを作り、HTML内でsrcを使って読み込んでいます。そのときに問題が発生しているのですが、外部ファイルでdocument.writeを使うと処理が戻ってきません。
例)
....
xxxx="テストJavaScript";
document.write(xxxx);
....
ちなみに、IEで実行した場合はきちんと表示し、NetScapeで実行した場合にずっと通信中になってしまいます。
これはNetScapeの仕様なのでしょうか。
分かりにくい説明で申し訳ありませんが、どなたかご回答お願い致します。

Aベストアンサー

もう、知っているかもしれませんが、ページを読み込んだ後に
document.write()するのは反則ですのでやめておきましょう。
また、document.write()の正しい使い方は以下の通りです。

document.open();
document.write("hoge");
document.close();

そして外部jsファイルは
<script>~</script>や<!--//-->などを書かずに保存していますか?
また外部jsファイルをHTMLから読み出すときは

<script type="text/javascript" src="ファイルのURL"></script>

としましょう。
結構、初歩的なことですが、見直してみてください。

QJavaScript document.writeについて

<ul id="font-size-change">
<li><a href="javascript:void(0)" onclick="setActiveStyleSheet('default'); return false;" />標準</a></li>
<li><a href="javascript:void(0)" onclick="setActiveStyleSheet('large'); return false;" />大</a></li>
</ul>

上記を、JavaScriptの「document.write」を使って表示しようと、下記のコードを書きました。

function fontSizeChange(){
document.write('<ul id="font-size-change">');
document.write('<li><a href="javascript:void(0)" onclick="setActiveStyleSheet');
document.write("('default'); ");
document.write('return false;" />標準</a></li>');
document.write('<li><a href="javascript:void(0)" onclick="setActiveStyleSheet');
document.write("('large'); ");
document.write('return false;" />大</a></li>');
document.write('</ul>');
}

とっても効率が悪い記述だと思うのですが、
もっとシンプルで効率の良い書き方はないでしょうか。

よろしくお願いします。

<ul id="font-size-change">
<li><a href="javascript:void(0)" onclick="setActiveStyleSheet('default'); return false;" />標準</a></li>
<li><a href="javascript:void(0)" onclick="setActiveStyleSheet('large'); return false;" />大</a></li>
</ul>

上記を、JavaScriptの「document.write」を使って表示しようと、下記のコードを書きました。

function fontSizeChange(){
document.write('<ul id="font-size-change">');
document.write('<li><a href="javascript:void(0)" onclick="setActive...続きを読む

Aベストアンサー

document.write("<ul id='font-size-change'>
<li><a href='javascript:void(0)' onclick='setActiveStyleSheet(\"default\"); return false;' />標準</a></li>
<li><a href='javascript:void(0)' onclick='setActiveStyleSheet(\"large\"); return false;' />大</a></li>
</ul>");
これでいけますよ。
囲むときは
"→'→\"
で囲めます。
改行したいなら他の回答者さんのように+を使って区切ってくださいね

Qdocument.write その2

w = (new Date()).getDay();
m = (new Date()).getMonth();
d = (new Date()).getDate();

if(w == 0) document.write("OKえて、GOO!");

毎週日曜日に表示するスクリプト(詳細省略)ですが、
9月9日(日)まで表示して、以後の日曜日には表示しないようにするには
if( ) の部分はどういう設定になるのでしょうか?

また、こういうことを自分で調べられるようなURLを紹介いただければ幸いです。
よろしくご教授お願いします。

Aベストアンサー

:
var et = new Date("2007/09/10 00:00:00").getTime();
var now = new Date().getTime();
if(w == 0 && now < et){
//表示
}
:

のようになると思います。
(毎年の9/9だと話が別ですが)

参考URLの上位パスは
http://www.tohoho-web.com/js/index.htm
です。

参考URL:http://www.tohoho-web.com/js/date.htm


人気Q&Aランキング

おすすめ情報