• ベストアンサー

パーセントエンコードは必要ですか?

検索結果のURLを貼るときに、ひらがながパーセントの文字列でいっぱいあるのですが、 これは必ずエンコードする必要があるのでしょうか。 そもそも、何のためにあるのでしょうか。 システムの誤作動を防ぐ※為なのでしょうか? ※ここでいう誤作動とは "削除コマンド"などを指します。

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

  • ベストアンサー
回答No.4

既にご回答されていますが、 ブラウザのURL欄では日本語(漢字やひらがな)に見えても 実際のデータとしてはURLエンコード(%XX)されています。 日本語にはJIS(ISO-2022-JP), ShiftJIS, EUC, UTF8 UTF16等々の 複数の文字コード種類があることをご存知でしょうか? 例えばJISコードでメール送信するように設定されてメールソフトを使っているとき コピー元がUTF8の漢字やひらがなのままのURLを そのままコピペするとメールソフトはUTF8からJISに変換してしまうので メールを受け取った人は、元々のURLと違うURLになってしまい メール中にあるURLにアクセスしても、 「404エラー、Not found、そんなページはないよ」 というエラーになってしまいます。 なので、誤動作防止の為にというのは、その通りなのですが URLに&deleteといったパラメータを付けられることで誤動作するのを 防ぐためにURLエンコードされている訳ではありません。 なお、URLに message=XX&delete を付けることで  他人が投稿したサーバー上のメッセージが削除可能かというのを 何度もご質問されている ようですが、 根本的に 考え違いをされているようです。 つまり、URLに deleteやremoveを指定すると、それを受け取った サーバー(コンピュータ)はそのまま、そのコマンドを実行してくれていると、 勘違いしているのではないでしょうか? サーバーが受け取ったURLを見て、 勝手に解釈して 勝手に実行するというとうな仕組みにはなっている訳ではなく 実際には、これらのURLのパラメータをどう指定すると どのように動作するかかというのは、すべてサーバー側でプログラミングされており、 例えば、URL中のパラメータ(GETデータ)やPOSTデータやCOOKIEデータや認証データを見て ログインしているユーザーが投稿者本人かを確認したうえで 指定された通りの処理を行うという形です。 なので、他人が闇雲に&deleteや&removeなんていうパラメータを適当に 指定しても (1)サーバーのプログラムでは、そんなパラメータはないよというエラーになるか (2)サーバーのプログラムにそのパラメータはプログラムされてないので、無視されるか (3)たまたま そのサーバー側のプログラムでそのパラメータが有効であっても  投稿者本人がログインしているわけではないので、権限がありません というエラーになるだけことです。 #20年ぐらい前のインターネットが使われ始めたころには、 #自作の掲示板(BBS)で 他人の投稿が削除できてしまうなんていう #バグが有るのを公開している人もいましたけど、 #今どきそういうのを使っている人はまずいないでしょう。 #掲示板自体が荒れるので、そういうのは淘汰されてしまっていますから。 その手のURLを擬装したアクセスは、 サーバー管理者にとっては脅威なので、悪意のある不正アクセスとみなされ アクセス拒否されたりアカウントが剥奪されたりということもあり得ます。 #本人に悪意がなくても、そんなことはサーバー管理者にはわかりませんし #通常の使い方をしないで、不正アクセスをしてくる迷惑な行為として、 #扱われてしまっても文句は言えないでしょう。

noname#246835
質問者

お礼

丁寧なご回答ありがとうございました。 URLの仕組みが分からなくなり非常に不安でしたが、とても安心しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • asciiz
  • ベストアンサー率70% (6657/9435)
回答No.3

>例えば、次のような検索結果のURLがあったとします。 > >① /search?q=meaning&delete >② /search?q=meaning&=delete > >①と②の場合、「&」をエンコードし忘れてシェアした場合、 >meaning というページや文字そのものが全削除されてしまうのでしょうか。 いいえ

noname#246835
質問者

お礼

回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • asciiz
  • ベストアンサー率70% (6657/9435)
回答No.2

URI(URLの元)の記述法を定義したRFCに、このようにあります。 >RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax >https://tools.ietf.org/html/rfc3986 >2. Characters > The ABNF notation defines its terminal values to be non-negative > integers (codepoints) based on the US-ASCII coded character set > [ASCII]. 「URIに使う文字は US-ASCII のみとする。」って書かれてます。 US-ASCII ってことはいわば7ビットで表現できる英数記号のみ、なので、8ビットが必要な(文字コード0x7Fを超える文字が含まれる)シフトJIS漢字データや、UTF文字コードなどはすべて、 >2.1. Percent-Encoding > pct-encoded = "%" HEXDIG HEXDIG パーセントエンコーディングすること、となっています。 そういうわけで、URLに漢字やひらがななどのデータが含まれる場合、基本的にはすべてパーセントエンコーディングされることとなります。 まあ、独自システムで8ビットデータを含むURLを使うのは自由なのですが。 そうして作ったシステムをインターネット上に置いたときは、8ビットデータを含むURLが正常にインターネット上で通信できるかどうか、保証されません。 「URI文字列には7ビットデータしか含まれない」という前提で、「URI処理に於いて8ビット目を無視する」というシステムがどこかにあるかも知れなくて、そこを通ってしまったら、8ビットデータを含むURLは化けてしまいます。

noname#246835
質問者

お礼

URLで認識できない文字で化けてしまうのですね。 詳しく回答ありがとうございました。

noname#246835
質問者

補足

例えば、次のような検索結果のURLがあったとします。 ① /search?q=meaning&delete ② /search?q=meaning&=delete ①と②の場合、「&」をエンコードし忘れてシェアした場合、 meaning というページや文字そのものが全削除されてしまうのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • t_ohta
  • ベストアンサー率38% (5097/13328)
回答No.1

URLに使用できる文字種が決まっており、ひらがな等の日本語文字はそのままHTTPプロトコルで送信できず、エンコードするためのルールが決められています。 なので必ずエンコードされます。 ブラウザのアドレスバーに日本語で表示されるのでは、閲覧者に見やすいようブラウザがデコードして表示してくれているだけです。

noname#246835
質問者

お礼

自分ではコンピュータの世界でいうほんやくコンニャクのように見えますね。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • フォーム送信とURLエンコードについて

    CGI&PHP初心者です。 フォームのデータ送信とURLエンコードについて、お尋ねします。 method="GET" のフォームで、検索フォームをつくりたいとおもっています。 日本語も含めた検索語をフォーム送信したいと考えていますが、 送信の結果、エンコードされずにそのままブラウザのURL欄に入力した日本語が表示されてしまいます。 (ただ、メモ帳などにURLをコピーペーストするとURLエンコードがされているようです。) googleでは検索結果のアドレス欄にURLエンコードされた文字列がでているが、 同じように検索結果のアドレス欄にはURLエンコードされた文字列をだしたい。 URLに日本語をださずにURLエンコードさせた文字列を表示させるには、 どうすればいいのでしょうか? 補足:できるかぎり検索処理が重くならないにしたいと思います。     開発環境PHP&MySQL     動作環境Chrome のバージョン 38.0

    • ベストアンサー
    • CGI
  • URLエンコードされたデータを戻すには

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

  • URLエンコードについて

    「 † 」 の文字をUTF-8 でURLエンコードした時の値が2種類あるんでしょうか。 以下の2つのURLエンコードした文字を %EF%BC%8D %E2%80%A0 URLエンコード/ デコードの結果を出力してくれる こちらのサイトと https://www.tagindex.com/tool/url.html こちらのサイト https://tech-unlimited.com/urlencode.html で結果が異なるみたいです。 なぜこういった結果が異なる状況が生まれるのでしょうか そして正しいのはどちらなのでしょうか

  • javascriptでEUCのエンコード

    検索エンジン用のエンコードした文字列をjavascriptで処理しようとしています。 encodeURIComponent で処理するとUTF-8でエンコードされてしまい、思うような結果が得られません。 EUCでエンコードされた結果を得る方法は無いでしょうか? ネットで探してみたのですがjavascriptだけで解決する方法を見つけられずに困っています。 javascript内で自作の関数を作ってもいいのですが、何かヒントがあればと思います。 よろしくお願いします。

  • URLの文字列をエンコードして表示させたい。

    IISでウェブサーバを立てて日本語のフォルダを参照できるようにしているのですがURLの文字列をコピーしてメールに貼り付けた時にリンクさせたい為、URLの日本語の文字列の部分をエンコードさせたいのですが何か良い方法はありませんか?

  • VBAでエンコードができる?

    お世話になってます。 現在、VBAでURLを作成(文字列を連結)して、IEを起動させようとしています。 そこで、日本語(DB名称)をエンコードして、パラメータとして渡したいのですが、エンコードする方法がわかりません。 どなたかわかる方がおられましたら、教えて下さい。 宜しくお願いします。

  • 日本語をGETで渡す場合URLエンコードは必要?

    下記の例のように全角文字をaタグのGETメソッドでPHPに渡し、その全角文字で検索した 結果を表示するスクリプトを製作中なのですが、 日本語内に空白等もないですし、あらかじめ検索する語が決まっているので ブラウザはIE9とFIREFOX9.0.1で試しましたが両方とも文字化けすることなくOKでした。 このスクリプトを万人向けに公開する場合、URLエンコード必要なのでしょうか? 例: <a href="http://hoge.php?word=日本語">日本語</a>

    • ベストアンサー
    • PHP
  • シフトJISでURLエンコード

    IEのJavaScriptのescapeで日本語をURLエンコードすると、UnicodeでURLエンコードしてしまいますが、シフトJISのままURLエンコードする方法はないのでしょうか? 文字列のシフトJISコードを取得する方法でも良いのですが・・・。 まったく、Unicodeなんて役に立たないものを無理矢理標準にしようとしないで欲しいナ!>MS

  • エンコードについて

    phpでXMLやデータベースとの連携を実験中です。結果、連携はうまくいったのですが、文字のエンコードについて思うことがあります。連携によって引き出された情報はテキストとなってphp上に表示されますが、エンコードがどれもUTF-8となっています。その為文字化けが起こってしまい、右クリック>エンコード>Unicode(UTF-8)という手順でエンコード方法を変更する手間が発生してしまいます。 製作側の自分自身はもちろんのこと、これではユーザー側にも面倒な一手間をかけてしまうことになります。 なんとかこのエンコード方法を一般的なSJISにする方法はありませんでしょうか?

    • 締切済み
    • PHP
  • URLのエンコードについて

    JavaScriptで、JSON形式で渡ってきたデータを読んで、一部、文字列を結合して URLを作るんですが、その際のエンコードは encUrl= 'http://test.com/' + encodeURIComponent(xxx) + '/'; (xxxがjsonからきたデータ) で大丈夫でしょうか? たとえば.NETで言うところのHttpUtility.UrlEncodeと同じことがしたいのですが、 URIエンコードだとたぶん違いますよね…。 何を使えばUrlEncodeが出来るのでしょうか。