問題タブ [percent-encoding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - クエリ パラメータ値の java.net.URI とパーセント
結果はhttp://example.com/servlet?a=x%2520y
で、クエリ パラメータの値が指定された値と異なります。奇妙ですが、これは Javadoc に従います。
「パーセント文字 ('%') は、これらのコンストラクターによって常に引用されます。」
デコードされた文字列を渡すa=x y
と、妥当な (?) 結果が得られa=x%20y
ます。
しかし、クエリ パラメータの値に「&」文字が含まれている場合はどうなるでしょうか。これは、たとえば、値がクエリ パラメータを含む URL 自体である場合に発生します。この (間違った) クエリ文字列を見てください:
a=b&c
. アンパサンドはここでエスケープする必要があります ( )。そうしないと、これはクエリ パラメーターおよびゴミとa=b%26c
見なされる可能性があります( )。これを URI コンストラクターに渡すと、エンコードされ、間違った URL が返されます。a=b
c
...?a=b%2526c
この問題により、java.util.URI が役に立たなくなるようです。ここで何か不足していますか?
回答のまとめ
java.net.URI は、URI のクエリ部分の存在を認識していますが、スキーマごとに異なる可能性があるクエリ部分の内部構造は理解していません。たとえば、java.net.URI は HTTP クエリ部分の内部構造を理解していません。java.net.URI がクエリを不透明な文字列と見なし、それを変更しなかった場合、これは問題になりません。ただし、HTTP URL を壊す一般的なパーセント エンコーディング アルゴリズムを適用しようとします。
したがって、コンストラクターがあるにもかかわらず、URI クラスを使用して URL をその部分から確実に組み立てることはできません。また、Java 7 の時点で、相対化操作の実装はかなり制限されており、ある URL が別の URL のプレフィックスである場合にのみ機能することにも言及します。私が java.net.URI に興味を持った理由は、これら 2 つの機能 (およびこれらの目的のためのより無駄のないインターフェース) でしたが、どちらも私にとってはうまくいきませんでした。
最後に、解析に java.net.URL を使用し、部分から URL を組み立てて 2 つの URL を相対化するコードを書きました。Apache HttpClient の URIBuilder クラスもチェックしましたが、HTTP クエリ文字列の内部は理解できますが、4.3 の時点で、クエリ部分全体を処理する際に java.net.URI のようなエンコーディングで同じ問題が発生します。
php - PHP の DOMDocument を使用する場合は、href 属性のパーセント エンコーディングを避ける
この問題に対して私が見つけることができた最良の答えは XSLT を使用することですが、それらの答えを私の問題に適用する方法がわかりません。
基本的に、DOMDocument は渡された URL (属性) をうまくエスケープしていますhref
が、私は実際にそれを使って Twig/Django スタイルのテンプレートを作成しています。「問題」を示す具体的な例を次に示します。
次を出力します。
href
属性をパーセントエンコードしないことは可能ですか?
直接できない場合は、簡潔で信頼できる回避策を提案できますか? 私は他の処理を行っており、DOMDocument の使用法は維持する必要があります。おそらく、前/後処理のトリックですか?
python - ヘルプ文字列に '%' がある Python argparse エラー
引数のヘルプ ドキュメントにも挿入する「%」を含むデフォルト値があります。例えば:
parse_args() での Argparse エラー
javascript - encodeURIcomponent が文字を正しいエンコーディング文字に置き換えない
私がする時:
戻り値:
これによると: http://www.degraeve.com/reference/urlencoding.php
文字: のú
はずです%FA
が、その%C3%BA
理由はこれであり、多くの文字列置換を行わずにこれを修正するにはどうすればよいですか?
python - スペースを含むフラスコ URL パラメータは、スペースを含む URL を生成します
ユーザーが指定した文字列を Flask URL パラメーターとして渡そうとしています。
url_for(func_name, param="string with spaces")
などは、スペースを含む URL を生成します。
ユーザーがスペースを含む文字列を入力すると、生成された URL にスペースが含まれているように見えます。
また、URL を入力する%20
と、スペースを含む URL にリダイレクトされるようです。スペースを含む URL は悪い考えだと思いました。
正しく動作させるにはどうすればよいですか (url_for
およびリダイレクト)? それともそのまま受け入れるべきでしょうか?
PS ユーザーが指定した文字列をパラメーターセーフとして渡していますか? そうでない場合、ユーザー入力文字列をどのようにサニタイズする必要がありますか?
html - Google Chrome と IE が '|' を置換しないようにする方法 %7C を含む URL
セマンティック URL を使用するように古い Web サイトを調整しましたが、さまざまな理由から/
、区切り記号として a を使用できません。代わりに、|
セパレータとして使用しています。
例えば:
小さな問題が 1 つだけあるだけで、すべてが正常に機能しています。Google Chrome と IE では URL が次のように表示されます。
|
セパレータをエンコードするために使用しています|
が、Chrome と IE はまだ%7C
.
Firefox と Safari は URL を正しく表示します。
url - '|' です セマンティック URL の推奨セパレータは?
Google と SO を調査したところ、これについては意見が対立しているようです。
Firefox と Safari はそうではありませんが、 Google Chrome では|
区切り記号をに置き換えるという問題が発生しています。%7C
次に例を示します。
セマンティック URL の区切り文字を選択する際に従うべき厳密な規則はあります|
か?
uri - { や } (中かっこ) などの文字を URL でパーセント エンコードする必要があるのはいつですか?
RFC 3986によると、次の文字は予約されており、予約された用途以外の URI で使用するには、パーセントでエンコードする必要があります。
:/?#[]@!$&'()*+,;=
さらに、特に予約されていないいくつかの文字を指定します。a-zA-Z0-9\-._~
一般に、(誤解を防ぐために) 予約文字をエンコードし、(読みやすくするために) 予約されていない文字をエンコードしないことは明らかですが、どちらのカテゴリにも該当しない文字はどのように処理する必要がありますか? たとえば、{
and}
はどちらのリストにも表示されませんが、標準の ASCII 文字です。
最新のブラウザーにガイダンスを求めると、動作が異なる場合があるようです。たとえば、URLhttps://www.google.com/search?q={
を Web ブラウザーのアドレス バーに貼り付けることを検討してください。
- Chrome 34.0.1847.116 m は変更しません。
- Firefox 28.0 では変更されていません。
- Internet Explorer 9.0 では変更されません。
- Safari 5.1.7 では次のように変更されます
https://www.google.com/search?q=%7B
ただし、貼り付けるhttps://www.google.com/#q={
と (「検索」を削除して を に変更し?
、#
クエリ文字列ではなくフラグメント/ハッシュの文字部分を作成)、次のことがわかります。
- Chrome 34.0.1847.116 m に変更し
https://www.google.com/#q=%7B
ます(JavaScript経由) - Firefox 28.0 では変更されていません。
- Internet Explorer 9.0 では変更されません。
- Safari 5.1.7 では
https://www.google.com/#q=%7B
(JavaScript を実行する前に) に変更します。
さらに、JavaScript を使用して要求を非同期に実行する場合 (つまり、この MDN の例を の URL を使用するように変更して使用する場合?q={
)、URL は自動的にパーセント エンコードされません。(これは、XMLHttpRequest API が URL が事前にエンコード/エスケープされていることを想定しているためだと思います。)
私は (奇妙な顧客の要求に関連する理由で) URL のファイル名部分で (1) 物事を壊すことなく、理想的には (2) 最新のネットワーク パネルで見苦しいパーセント エンコードされたエントリを作成することなく、{
andを使用したいと考えています。}
ブラウザーの Web インスペクター/デバッガー。