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&Aを見た人が検索しているワード

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

Q文字化けメールの修復方法は?

文字化けメールが届いてしまいました。
エンコードの問題ではないようです。修復する方法はありますか?

Aベストアンサー

以下のHPで、もしかしたら読めるかもしれません。

参考URL:http://www.kanzaki.com/docs/jis-recover.html

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 は文章の最後を意味している
と思われるわ
全文がないので推測だけど

Qメールが全部文字化け!どうすれば修復できますか?

outlookexpress6を使用しています。

ある日突然受信トレイにあるメール内容がすべて文字化けされてしまいました。
どうしたらいいのでしょう・・

元にもどるのでしょうか。。。

エンコード設定でunicode utf8にしたら、自分のメールから自分のメールに送ったらうまくおくれたのですが、外部からおくられてくるメールはいまだに文字化けのままです。。。
受信トレイにたまったメールもすべて文字化けのままなので修復したいです。

お詳しい方どうぞアドバイスよろしくお願いします!

Aベストアンサー

次の操作を試してみてください。

1.[ツール]→[オプション]を実行
2.[読み取り]タブを選択
  2.1.[エンコード]→“日本語(自動選択)”
  2.2.[既定に設定]をクリック ← これ重要!
  2.3.[OK]をクリック

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 文字化けの修復方法

windouws 98 NEC ノートパソコンで
文字化けしてしまい一般的な修復方法の
セーフモードにして再起動するとよく直っていたんですが今回は直りませんでした。
セーフモード中は直って普通に見えるのですが
再起動で立ち上げるとま文字化けしてしまいます
何か良い改善方法をおしえてください。
お願いします。

Aベストアンサー

参考URLをご覧のうえ、対処してください。

参考URL:http://homepage2.nifty.com/winfaq/fontstrouble.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>

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

Q文字化けしたワードファイルの修復方法を教えてください

word2003で作成し、保存していた文書を、同じパソコンのword2003で開いたら文字化けしていました。
以前見たときは正常に表示されていて、その後何か操作をした覚えもありません。
文字化けした部分は□が並んだようになっています。

教えてgooの過去の質問や、他のサイトをみて解決方法を調べ、フォントを変える、htmlファイルやrtfファイルで保存しなおす、ワードパッとにコピーする、等色々試して見ましたが直りません。

大切な文書でしたので、修復方法をお教えください。
お願いします。

Aベストアンサー

☐の部分は、文字(文字コード)であったことは確実ですか。
例えば1例でも、(元は)どんな内容か思い出せますか。
正しく表示されていたころは、質問者はそれを見た事を覚えていますか。
ところどころ、少ない部分だけですか。
その後何か特別なことをした、ことは思い出せませんか。
ーー
「文字化け」というのは文字コード(体系)の問題だと思います。間接的にFontなどと関連しますが直接的ではないと思う。
もがいている方向性が疑問に思ったもので。
http://www.asahi-net.or.jp/~ax2s-kmtn/character.html
本質問の解決に直接役に立たないと思うが、参考までに見て置いてください。
何か思い当たる点は無いですか。
上記WEBにもある、機種依存文字など関係ないですか。
文書やファイル作成時に使われた文字コード体系がファイルに記録されるとはっきりするが、そういうOSの仕組みではないようなので難しい。

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>");
これでいけますよ。
囲むときは
"→'→\"
で囲めます。
改行したいなら他の回答者さんのように+を使って区切ってくださいね

Q文字化けしたフランス語のメールを修復するには?

フランス語のメールが文字化けしてしまい、
うまく読めなくなってしまいました。

すでに難しい漢字などが紛れてしまった文章を
修復できるようなフリーソフトなどはございませんか?
またはPCの簡単な設定で修復する方法がありますか?
こちら、windows vistaです。
初心者でもわかりやすいものがあれば教えてください。

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

Aベストアンサー

duosonic です。お疲れ様でした。
ユードラって亜流です、ハッキリ言って。もともとマック用にデザインされた?らしいので、Windowsとは相性悪いのもうなづけます。そもそもライブドアホリエモンが関わっているというだけで、僕の中ではボツです (^^;)

Vistaには Windows Mailが入っていますよね。それで再生できませんかね?

>>あいさつ程度のフランス語しかできませんので、差出人のフランス人にもう一度送って~なんていうことを言えるかどうか・・・(;_;)
>あそうなんですか。何と申し上げて良いのやら 、、、(-_-;)

通じるか否か分からないフランス語で書くよりも、英語で出しちゃうのは手ですよ。欧州人は大抵英語大丈夫ですから。(僕の回答歴?ご覧頂くとお分かりかと思いますが、)英語ならいくらでもお教えいたしますので、ご安心下さい。或いは、フランス語を書けるだけ書いて、外国語?カテで内容が大丈夫か聞いてくるのも手です。


ご参考までに。

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を見た人がよく見るQ&A

人気Q&Aランキング