URLでのアンパサンドのエスケープ


203

アンパサンドを含む文字列を含むGETメッセージを送信しようとしていますが、URLでアンパサンドをエスケープする方法を理解できません。

例:

http://www.example.com?candy_name=M&M
result => candy_name = M

私も試しました:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

URLを手動で使用しているため、正しい文字が必要です。

ライブラリは使用できません。どうすればできますか?

回答:


350

それらはパーセントエンコードする必要があります:

> encodeURIComponent('&')
"%26"

したがって、あなたの場合、URLは次のようになります。

http://www.mysite.com?candy_name=M%26M

2
:-%26が機能しません。他の解決策はありますか?
Sanjiv 2016

2
&を%26に置き換えても、同じエラーが表示されますA potentially dangerous Request.Path value was detected from the client (&).
Sanjiv

4
@Sanjiv:これはコードの問題であり、パーセントエンコーディングではありません。質問する。
Blender 2016

2
@Sanjivでは、最初に「&」を「%26」に置き換えてください。コードを参照してください::: NSString * message = @ "Hello Jack&Jill"; メッセージ= [メッセージstringByReplacingOccurrencesOfString:@ "&" withString:@ "%26"]; メッセージ= [メッセージstringByAppendingString:@ ""]; message = [message stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
Nirav 2017年

40

これは、URLのアンパサンドだけでなく、すべての予約文字にも適用されます。その一部は次のとおりです。

 # $ & + ,  / : ; = ? @ [ ]

アイデアは&HTMLドキュメントでののエンコードと同じですが、コンテキストはHTMLドキュメント内にあることに加えて、URI内にあるように変更されました。したがって、パーセントエンコーディングは、両方のコンテキスト内の解析に関する問題を防ぎます。

これが非常に便利なのは、URLを別のURLの内部に配置する必要がある場合です。たとえば、Twitterにステータスを投稿する場合:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

つぶやきには予約文字がたくさんあるため?'():/statusURLパラメータの値全体をエンコードしました。これmailto:は、メッセージの本文または件名を持つリンクを使用する場合にも役立ちます。これは、改行やアンパサンドなどをそのままに保つためにbodyおよびsubjectパラメータをエンコードする必要があるためです。

予約セットの文字(「予約文字」)が特定のコンテキストで特別な意味(「予約目的」)を持ち、URIスキームがその文字を他の目的に使用する必要があると述べている場合、文字パーセントエンコードする必要があります。予約文字のパーセントエンコードでは、文字をASCIIの対応するバイト値に変換し、その値を16進数のペアとして表します。エスケープ文字として使用されるパーセント記号( "%")が前に付いた数字は、予約文字の代わりにURIで使用されます。(非ASCII文字の場合、通常はUTF-8でバイトシーケンスに変換され、各バイト値は上記のように表されます。)たとえば、「パス」で使用されている場合、予約文字「/」URIのコンポーネント。パスセグメント間の区切り文字となるという特別な意味があります。特定のURIスキームに従って、「/」をパスセグメントに含める必要がある場合、セグメントでは、「/」ではなく「%2F」または「%2f」の3文字を使用する必要があります。

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters


4
上記のリストのうち、! ' ( ) *を使用してエンコードされたURL ではありませんencodeURIComponent
Amil Waduwawara 2014年

この問題を解決するphp関数urlencodeがあります:使用法$ escapedfilename = urlencode($ filename);
ジェレミーヤング


3

%文字を使用して、URLで許可されていない文字を「エスケープ」できます。[RFC 1738]を参照してください。

http://www.asciitable.com/のASCII値の表。

&16進数で26であることがわかるので、M%26Mが必要です。


2

これは、誰かがPHPでそれを望んでいる場合に役立ちます

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);


1

ブレンダーソリューションに関するマイナーなコメントを追加したいと思います。

次のことができます。

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

それは出力します:

http://example.com?candy_name=M%26M

この素晴らしい点は、&だけでなく、特別なキャラクターにも機能します。

例えば:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

出力:

"http://example.com?candy_name=M%26M%3F%3E%3C"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.