• ベストアンサー

クッキーの値のエンコード/デコードの理由

JavaScriptでクッキーを作成する為に『とほほ』へ行ったところ、 クッキーの値はエンコード/デコードする必要があると書かれていました。 今日まで2年間ずっと知らないままJavaScriptやCGIでクッキーの読み書き処理 をしていました。 とほほにはその詳しい理由が書かれておらず、 他のウェブサイトでも理由が見つからなかったので教えていただけたら幸いです。 やはりエンコードが必要ということは異なるOS間で不具合が起きるということで、 自分のマシンで動作チェックするだけでは不具合は発見できないということなんでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ahsblue
  • ベストアンサー率58% (23/39)
回答No.1

例えば以下のデータのような場合に困るからです。 A は 「1=2」 B は 「&」 というデータをクッキーに書き込むと A=1=2&B=& で、読み込み&分解するときに 制御記号の=なのかデータの=なのか判断がつかなくなってしまいます。 そこでエンコードしたデータを用いるとデータの=や&などがコードに変換されるため正常に読み書きが可能になるっということです。

katsudon
質問者

補足

ありがとうございました。 とほほのhttp://tohoho.wakusei.ne.jp/wwwcook.htmでは、 『Cookieの値では、=や;などの特殊記号や日本語文字は %82%A0 のような形式にエンコードして記録しておき、読み出し時にこれをデコードしてやる必要があります。』 と書かれており、この"日本語文字"という言葉に『ということはOSに依存するから必要ということか?』と思ってしまいました。 では、=や&、;、スペースなどを値に使用しなければ、日本語をそのままクッキーに記録しても支障はないということでいいのでしょうか?(Windows 98/Me + IE5/6で今までそうやって来たのですが)

その他の回答 (1)

  • ahsblue
  • ベストアンサー率58% (23/39)
回答No.2

OSに依存するというのも70点くらいで正解なのですが、正確には文字コードに依存します。 Windows=シフトJIS Mac=シフトJIS? Linux=EUC HP-UX=シフトJIS とOSにより標準となっている文字コードが異なります。 またこれは、標準であって設定を変更することも可能です。 ただ言えるのは英数字だけの場合は、各文字コードで共通のコードを使用するためエンコードしなくても正常に動作します。

katsudon
質問者

お礼

大変丁寧に解説いただきありがとうございました! ということはシフトJISの文字化けと同じ問題なのですね。 では、やはり一般的なユーザを対象にするならエンコードは必須なわけですね。 各ユーザの既存のクッキーの変更をかけるのは非常に難しいですが、 少しずつエンコードされたクッキー情報に修正したいと思います。 重ねてお礼します。大変ありがとうございました!

関連するQ&A

  • URLエンコードされたデータを戻すには

    POSTでCGIに渡す文字列はURLエンコードされていて、元に戻すにはデコードが必要ですが、もともとURLエンコードされたデータをデコードしたデータにできないでしょうか。 普通は、 読める文字→URLエンコード→CGIによる処理→URLデコード→読める文字 ですが、 もとのデータがURLエンコードされた状態だと、 URLエンコードされた文字→URLエンコード→CGIによるURLデコード→URLエンコードされた文字 となってしまいます。 たとえば、「%82%a0%82%a0%82%a0」というデータ形式から、「あああ」というデータを得たいのです。

  • PHPとjavascriptで共通なエンコード方法

    PHPからjavascriptにバイナリデータ(16バイト程度)を受け渡す 処理を作成しているのですが、うまく動作しないので、相談します。 バイナリデータをエンコードしてPHPからjavascriptに 以下の流れで引き渡しています。 (1)PHPのbase64_encodeでバイナリデータをエンコード (2)エンコードしたデータをjavascriptに出力 (3)javascriptでデータをデコード (3)のデコードには次のページのbase64.jsなど、いくつかの デコード方法を試してみました。 http://www.onicos.com/staff/iz/amuse/javascript/expert/ しかしながら(1)の元のデータと(3)でデコードしたデータが 一致しません。 質問したいのは以下の2点です。 ・PHPのbase64_encodeとjavascriptのbase64エンコードは  一般的に方式が違うのでしょうか。同じbase64なので  同じコードが生成されると考えたのですが、そうでは  ないのでしょうか。 ・base64_encodeでも、その他の方法でもかまわないので  PHPとjavascriptで共通なエンコード方式、あるいは  PHP上のバイナリデータをjavascriptに正しく受け渡す  方法があれば教えて下さい。 よろしくお願いします。

  • PHPからjavascriptへGETで値を渡すとき

    初歩的な質問で失礼いたします。 PHPからjavascriptへGETで値を渡すときにマルチバイト文字が文字化けしてしまいます。 javascriptのjQueryというライブラリを利用しています。 具体的には、 -------------- test.js -------------- var url = 'test.php?code=' + code; $.get(url, function(data){ alert(data); } -------------------------------------- --------------- test.php ------------- $input = $_GET['code'];  ・・・mysqlの処理・・・ echo $output; --------------------------------------- という処理をしています。 test.js → test.phpへ渡す値はマルチバイトではないので問題ないのですが、 test.php → test.jsへ返す値はマルチバイトで文字化けしてしまいます。 php側でrawurlencode関数でエンコードしてから、javascript側でdecodeURI関数を使用してデコードしたのですが、うまくデコードできませんでした。 恐らくデコードの仕方が悪いんだと思うんですが。。。 分かりにくい説明で恐縮ではございますが、ご回答をお願いいたします。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 日本語でクッキーを読み書きしたいんですが。

    初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説HPでは、 >CGI(Perl)でエンコードするには次のようにします。 >$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; >CGI(Perl)でデコードするには次のようにします。 >$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; と、書いてあるのですが、どこを書き換えればいいのでしょうか。ぜひご伝授をお願いします。 なお、只今改造中のソースは以下のURL掲載に掲載されております。 http://softplaza.biglobe.ne.jp/text/cgi/cgi13/cgi13-4.html

    • 締切済み
    • CGI
  • クッキーの利用について

    CGIのプログラムで、複数の異なるURLのファイルからJavascriptを介してクッキーを利用する仕組みを考えています。 SetCookieでpath、domainの値を指定していますが、SetCookie後、発行したフォルダから他のフォルダに移動して再びsetCookieを行おうとすると、Cookieに正しく値が設定されないという現象が起こって困っております。 おそらくSetCookieの値の書き方の問題かと思いますが、どなたかおわかりになる方はいませんか?

  • 携帯電話の絵文字とURLエンコード/デコードについて

    携帯電話の絵文字とURLエンコード/デコードについて Java・シェルスクリプトによるCGIとPHPを用いた 携帯電話向けのウェブアプリを開発しています。 アプリの内容としては、PHP側で生成したHTMLのフォームから ユーザーに入力してもらった文字列を引数としてJava側に渡し、 Java側で値を受け取ってから、文字列変換処理を行うものです。 この際の、携帯電話特有の絵文字の取り扱いについてつまずいています。 PHPとPHPとの間の場合は、フォームから送られるパラメータが 絵文字を含んでいたとしても、特に何の問題なく絵文字パラメータの 入力・送信(<input type="text" name="hoge" value="EMOJI">)・ 受信・表示(echo $_REQUEST['hoge']; で EMOJI を表示する)ができていたのですが、 フォームから送られるURLエンコードされたクエリー文字列を Java側で引数として受け取り、もとの文字列に戻すためにURLデコードの処理をかけると、 携帯電話で入力した絵文字の部分だけ文字化けしてしまいます。 (現在確認の取れているのは、ドコモの絵文字とauの絵文字が「 ? 」 (半角のクエスチョンマーク)に化けてしまう事態です) PHPどうしの間でフォームによってPOSTやGETで送受信される際も 入力された値がいったんURLエンコードされてから HTTPリクエストに乗ることは間違いないと思うので、 Java側のURLデコーダーの問題かと思われるのですが (たとえば、未知の範囲のバイナリはすべて例外として ? にしてしまう、など)、 どなたか解決策等をご存じないでしょうか。 ちなみに現状、絵文字以外の通常の文字列に関しては目立った問題はなく 受信、変換処理、表示等ができている段階なので、 最後の最後に絵文字の問題だけが残ってしまい、困っています。 よろしければ、ご教唆のほど、よろしくお願い申し上げます。 参考までに、開発環境は以下の通りです。 ・Windows XP SP3 + Eclipse Build id: 20100218-1602(ローカル開発環境) ・Cent OS 5.3(アプリ実行用VPSサーバー) ・Sun JDK SE: 1.6.0_20 (開発用Windowsマシン・アプリ実行用サーバともに同じバージョン) ・使用言語および文字コード  Java、PHP、日本語、Shift_JIS(携帯電話のうち、ドコモがShift_JISを標準とするため) ・URLデコーダーに使っているパッケージ・クラス  org.apache.commons.codec.net.URLCodec の decode()メソッド (Shift_JISの場合、java.net.URLDecoder は java.net.URLEncoderでエンコードしたものしか正常にデコードできないため) (参考: http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25659&forum=12 ) ( http://commons.apache.org/codec/download_codec.cgi )

    • ベストアンサー
    • Java
  • Perl/CGIでのエンコード方法

    perlを使ってプログラムを書いています。 そこで困ったことが発生しております。 会員用CGIでフォーム上にIDとパスを入力するとログインできるプログラムです。 フォームにIDとパスを入力すると入室できますがログイン後、 http://www.*****.net/bbs.cgi?mode=check&ID=あゆ&PASS=0000 のようになったURLをクリックすると「ページが見つかりません」400エラーがでます。 IDが「あ」ではじまるものだけがこのような症状になります。 エンコード処理されていないからと思うのですが、これを正常な受け渡しをするにはどの辺りの場所にエンコード処理とデコード処理を書けばいいのでしょうか? ただ、Aサーバーでは発生しないのにBサーバーでは発生します。サーバーにも依存するものでしょうか? たいへん困っています。 お手数かけますが何卒宜しくお願いします

    • ベストアンサー
    • CGI
  • クッキー有効が反映されない?

    インターネット中に?が出たので質問させてください。 クッキー設定は自動処理を上書きする、全てのクッキーを受け入れる、になっているんですが、お知り合いさんのlolipopサーバーにある投票CGIをクリックしようとしたら、「クッキーを有効にする必要があります」と出ました。 プライバシーレポートの確認もしましたが特にブロックされている様子はありません。 こういう場合、何が悪い可能性があるのでしょうか? IE6、Firefox1です。

  • BASP21によるbase64のデコードについて

    base64でエンコードされた画像ファイルを表示したいと思っています。 basp21でデコードして、BinaryWriteで書き出したんですがうまく表示できません。 CAPICOMを使った場合は正しく表示されます。 basp21でデコードする際になにか処理をはさむ必要があるのでしょうか? 以下作成したサンプルソースです。 ---ソース------------------------------------------ <%@ Language="VBScript" %> <% Set Stream = Server.CreateObject("ADODB.Stream") Set CAPIUtil = Server.CreateObject( "CAPICOM.Utilities" ) Set objBasp = Server.CreateObject("basp21") strEncoded = "/9j/kL・・base64でエンコードされたJpegファイル" strDecoded = CAPIUtil.Base64Decode( strEncoded ) strDecoded2 = objBasp.Base64(strEncoded, 1) Response.ContentType = "image/jpeg" ' Response.BinaryWrite strDecoded ' Response.BinaryWrite strDecoded2 %> ---------------------------------------------ここまで----- 以上よろしくお願いいたします。

  • クッキーを使用してデータの受け渡しをしたい

    よろしくお願いします。 既に稼動しているシステムの修正などを手がけていますが、全く素人です。 html内に、<script ・・>~~</script>でJavaScriptを埋め込んでクッキーを読み書きしてデータの受け渡しをしようとしています。 現在動いているものでは、商品案内画面から、注文画面に移りますが、そこでもう1度商品を選ばなければなりません。 そこで、案内画面htmlで、setcookieでクッキーに商品番号を書いて、注文画面htmlで、まず、scriptでgetcookieで得た値を、定義したフィールドに移しますが、さて、そのフィードを、html内で表示するには、どうしたらよいのでしょうか。 その商品入力フィールド(実際はselectなのですが)に、initial値として先の商品番号を入れておくようにしたいのですが。 クッキーの読み書きのscriptは一応本を読んで書いてみました。クッキーが書かれるのは確認しました。 読み込んで、定義したフィールドに移すところも書けると思います。ただ、そのscript内のフィールドを、html内で使用する方法がわかりません。