C #, JavaScript'in encodeURIComponent () değerine eşdeğer mi?


135

JavaScript'te:

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

C # uygulamaları için bir eşdeğeri var mı? Kaçan HTML karakterleri için kullandım:

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

Ancak, eşleşmeyi JS'nin kullandığı doğru onaltılık biçime nasıl dönüştüreceğimden emin değilim. Örneğin bu kod:

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

Bunun yerine " %a9%221a"for " döndürür . Dizeyi bayta veya başka bir şeye bölmem gerekiyor gibi görünüyor."©√""%C2%A9%E2%88%9A"

Düzenleme: Bu bir windows uygulaması için olduğu, mevcut olan tek öğe System.Web: vardır AspNetHostingPermission, AspNetHostingPermissionAttributeve AspNetHostingPermissionLevel.

Yanıtlar:


217

Uri.EscapeDataStringveya HttpUtility.UrlEncodebir URL'nin parçası olması amaçlanan bir dizeden kaçmanın doğru yoludur.

Örneğin dizeyi ele alalım "Stack Overflow":

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

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

  • Uri.EscapeDataString("Stack + Overflow")-> Ayrıca kodlar "+" to "%2b"---->Stack%20%2B%20%20Overflow

Yalnızca sonuncusu, URL'nin gerçek bir parçası olarak kullanıldığında doğrudur (sorgu dizesi parametrelerinden birinin değerinin tersine)


Karşılaştığım ana sorun, çözümümde System.Web'e referans olmamasıydı, ancak EscapeUriString'in farkında değildim, teşekkürler!
travis

53
EncodeURIComponent () 'in aksine, Uri.EscapeUriString () "+"' yı "% 2b" olarak kodlamaz. Bunun yerine Uri.EscapeDataString () kullanın.
jwaliszko

4
System.Web'e başvurmak zorunda kalmamak için HttpUtility yerine WebUtility kullanın. HttpUtility .NET Core'da mevcut değil.
Steven De Kock

2
@Steve Son paragrafınızı kalın yapmayı düşünür müsünüz? Bu sayfada bilinmesi gereken en önemli şey gibi görünüyor ve daha fazla görünürlük gerektiriyor.
Timo

Uri.EscapeUriString ve Uri.EscapeDataString arasındaki fark hakkında daha fazla açıklama için bu yanıta bakın: stackoverflow.com/questions/4396598/…
Jason

20

HttpUtility.HtmlEncode/ Kod Çözme
HttpUtility.UrlEncode/ Kod Çözme

System.WebProjenizde mevcut değilse montaja bir referans ekleyebilirsiniz .


Daha spesifik olmalıydım: Bu bir Windows uygulaması içindir, System.Web'de bulunan tek öğeler şunlardır: AspNetHostingPermission, AspNetHostingPermissionAttribute ve AspNetHostingPermissionLevel.
travis

5
System.Web derlemesine bir başvuru ekleyebilirsiniz
David Thibault

2
HtmlEncoding tamamen farklı bir şeydir. UrlEncode, hiçbir zaman kullanılmaması gereken, hassas olmayan bir API'dir. Bir URL'nin tamamını kodlamanın bir anlamı yoktur (değerini bir parametre olarak kullanmak için gerçekten kodlamak istemediğiniz sürece - ancak bunun yaptığı bu değildir). Kodlamanın / kaçmanın amacı, ayrılmış bir karakterin olağan anlamı olmadan geçirilmesi gerektiğini iletmenizdir (örneğin,? Sorguyu tanımlar veya & sorgu parametrelerini ayırır). Bu, UrlEncode'un sahip olmadığı ve sahip olamayacağı bilgisi gerektirir.
Brandon Paddock

18

Javascript encodeURIComponent'in c # için tam uyumlu analogunu yapmaya çalıştım ve 4 saatlik deneylerimden sonra bunu buldum

c # KOD:

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

sonuç: !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20text% 20burada% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% olarak% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Javascript decodeURLComponent () ile kodunu çözdükten sonra;

bunu alacaksınız:! @ # $% ^ & * () _ + burada biraz metin али мамедов баку

İlginiz için teşekkür ederim


2
Çalışır, ancak Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")bunun yerine kullanabilirsiniz .
mklement0

Aslında, Uri.EscapeDataString'(' ve ')' karakterlerini kodlarken kodlamaz HttpUtility.UrlEncode.
Øystein Kolsrud

12

System.Uri.EscapeUriString () hiçbir şey yapmıyor gibi görünüyor, ancak System.Uri.Escape Data String () benim için çalıştı.


10

Deneyin Server.UrlEncode()veya nesneye System.Web.HttpUtility.UrlEncode()erişiminizin olmadığı durumlar için Server. System.Uri.EscapeUriString()Montaja bir referans eklemekten kaçınmak için de kullanabilirsiniz System.Web.


1
Uri.EscapeUriString () benim için hiçbir şey yapmadı, ancak Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: Gerçekten. Bunun nedeni, URI'ye ayrılmış karakterleri koruyan Uri.EscapeUriString()JavaScript'lere karşılık encodeURI()gelmesidir. gibi /, &(artı olduğu gibi, ... #), oysa - keşfettiğiniz olarak, öyle Uri.EscapeDataString()JavaScript adlı bu karşılık encodeURIComponent().
mklement0

8

Bir Windows Mağazası Uygulaması için HttpUtility'ye sahip olmayacaksınız. Bunun yerine şunlara sahipsiniz:

Bir URI için "?" İşaretinden önce:

  • Sistemi. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

Bir URI sorgu adı veya değeri için "?" İşaretinden sonra:

  • Sistemi. Uri.EscapeDataString ("Yığın Taşması ++")
    • -> "Yığın% 20Overflow% 2B% 2B"

Bir için x-www-form-urlencoded POST içeriğinde sorgu adı veya değer:

  • System.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "Yığın + Taşma% 2B% 2B"

6

System.Web ad alanında Server nesnesini kullanabilirsiniz.

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode ve Server.HtmlDecode.

Düzenleme: poster, bunun bir Windows uygulaması olduğunu ve birinin inandığı gibi bir web uygulaması olmadığını ekledi. Yukarıda listelenen öğeler, projeye referans olarak eklenmesi gereken System.Web içindeki HttpUtility sınıfından elde edilebilir.


1
Sunucu nesnesine bir Windows uygulamasından erişilemez
travis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.