C#にはJavaScriptのencodeURIComponent()と同等のものはありますか?


135

JavaScriptの場合:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

C#アプリケーションに相当するものはありますか?私が使用したHTML文字をエスケープするために:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

しかし、JSが使用する正しい16進形式に一致を変換する方法がわかりません。たとえば、次のコード:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

戻り値" %a9%221a"について"©√"代わりにを"%C2%A9%E2%88%9A"。文字列をバイトなどに分割する必要があるようです。

編集:これは、Windowsのアプリ、アイテムのみ利用可能であるためにSystem.Web:あるAspNetHostingPermissionAspNetHostingPermissionAttributeAspNetHostingPermissionLevel

回答:


217

Uri.EscapeDataStringまたはHttpUtility.UrlEncode、URLの一部となる文字列をエスケープする正しい方法です。

たとえば、文字列を取る"Stack Overflow"

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow")->エンコードもする"+" to "%2b"---->Stack%20%2B%20%20Overflow

URLの実際の部分として使用された場合、最後のものだけが正しいです(クエリ文字列パラメーターのいずれかの値とは対照的)


私が抱えていた主な問題は、ソリューションにSystem.Webへの参照がないことでしたが、EscapeUriStringに気付かなかったので、ありがとうございます。
トラビス、2011年

53
encodeURIComponent()とは対照的に、Uri.EscapeUriString()は「+」を「%2b」にエンコードしません。代わりにUri.EscapeDataString()を使用してください。
jwaliszko 2012

4
System.Webを参照する必要がないように、HttpUtilityの代わりにWebUtilityを使用します。HttpUtilityは.NET Coreには存在しません。
Steven De Kock

2
@Steve最後の段落を太字にすることを検討しますか?このページで知っておくべき最も重要なことのように思われ、より多くの可視性が必要です。
Timo

またUri.EscapeUriStringとUri.EscapeDataStringとの差により説明についてはこの回答を参照してください。stackoverflow.com/questions/4396598/...
ジェイソン

20

HttpUtility.HtmlEncode/デコード
HttpUtility.UrlEncode/デコード

System.Webプロジェクトで使用できない場合は、アセンブリへの参照を追加できます


もっと具体的に説明する必要があります。これはWindowsアプリ用であり、System.Webで使用できる項目は、AspNetHostingPermission、AspNetHostingPermissionAttribute、およびAspNetHostingPermissionLevelのみです。
トラビス

5
System.Webアセンブリへの参照を追加できます
David Thibault

2
HtmlEncodingはまったく別のものです。UrlEncodeは無意味なAPIであるため、使用しないでください。URL全体をエンコードしても意味がありません(実際にその値をエンコードしてパラメーターとして使用したい場合を除きますが、これはそうではありません)。エンコード/エスケープのポイントは、予約文字が通常の意味なしでパススルーされる必要があることを伝えていることです(たとえば、?はクエリを識別するか、&でクエリパラメータを区切ります)。これには、UrlEncodeが必要としない知識を必要とします。
Brandon Paddock

18

私はJavaScriptのencodeURIComponentの完全な互換性のある類似物をc#のためにしようとしました、そして私の4時間の実験の後に私はこれを見つけました

c#コード:

string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");

結果は !%40%23%24%25%5e%26 *()_%2b%20some%20text%20here%20%d0%b0%d0%bb%d0%b8%20%d0%bc%です。 d0%b0%d0%bc%d0%b5%d0%b4%d0%be%d0%b2%20%d0%b1%d0%b0%d0%ba%d1%83

JavascriptのdecodeURLComponent();でそれをデコードした後。

あなたはこれを得るでしょう: !@#$%^&*()_ +ここにいくつかのテキストалимамедовбаку

清聴ありがとうございました


2
動作しますが、Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")代わりに単純に使用できます。
mklement0 2016

実際にUri.EscapeDataStringは、文字 '('および ')'をエンコードしますが、エンコードしHttpUtility.UrlEncodeません。
ØysteinKolsrud

12

System.Uri.EscapeUriString()は何もしなかったようですが、System.Uri.Escape Data String()がうまくいきました。


10

を試すServer.UrlEncode()System.Web.HttpUtility.UrlEncode()Serverオブジェクトにアクセスできない場合に使用します。を使用System.Uri.EscapeUriString()して、System.Webアセンブリへの参照の追加を回避することもできます。


1
Uri.EscapeUriString()は何もしませんでしたが、Uri.EscapeDataString()を使用して文字列を適切にURLエンコードできました
Toland Hon

3
@TolandHon:確かに。その理由は、URIで予約された文字を保持Uri.EscapeUriString()するJavaScriptに対応しているためですencodeURI()。以下のような/&...である-など(プラス#)、一方で-あなたが発見したとして、それがあるUri.EscapeDataString()のJavaScriptのへの対応encodeURIComponent()
mklement0 2016

8

Windowsストアアプリの場合、HttpUtilityはありません。代わりに、あなたは持っています:

URIの場合、「?」の前:

  • システム。Uri.EscapeUriString( "example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

URIクエリの名前または値の場合、「?」の後:

  • システム。Uri.EscapeDataString( "Stack Overflow ++")
    • -> "Stack%20Overflow%2B%2B"

以下のためのx-www-form-urlencodedでクエリ名または値、POST含有量:

  • System.Net。WebUtility.UrlEncode( "Stack Overflow ++")
    • -> "Stack + Overflow%2B%2B"

6

System.Web名前空間でServerオブジェクトを使用できます

Server.UrlEncode、Server.UrlDecode、Server.HtmlEncode、およびServer.HtmlDecode。

編集:ポスターは、これはWindowsアプリケーションであり、信じられないほどのWebアプリケーションではないことを追加しました。上記の項目は、プロジェクトへの参照として追加する必要があるSystem.Web内のHttpUtilityクラスから利用できます。


1
Windowsアプリからサーバーオブジェクトにアクセスできない
トラビス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.