C # มีคุณสมบัติเทียบเท่ากับ encodeURIComponent () ของ JavaScript หรือไม่


142

ใน JavaScript:

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

มีแอปพลิเคชัน C # เทียบเท่าหรือไม่? สำหรับการหลีกเลี่ยงอักขระ HTML ที่ฉันใช้:

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

แต่ฉันไม่แน่ใจว่าจะแปลงการจับคู่เป็นรูปแบบเลขฐานสิบหกที่ถูกต้องที่ JS ใช้อย่างไร ตัวอย่างเช่นรหัสนี้:

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

ผลตอบแทน " %a9%221a"สำหรับ"©√"แทน"%C2%A9%E2%88%9A". ดูเหมือนว่าฉันจะต้องแยกสตริงขึ้นไปไบต์หรือบางสิ่งบางอย่าง

แก้ไข: นี่คือสำหรับ app หน้าต่างรายการเดียวที่มีอยู่ในSystem.WebคือAspNetHostingPermission, และAspNetHostingPermissionAttributeAspNetHostingPermissionLevel

คำตอบ:


225

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 ขอบคุณ!
travis

56
ตรงกันข้ามกับ encodeURIComponent () Uri.EscapeUriString () จะไม่เข้ารหัส "+" เป็น "% 2b" ใช้ Uri.EscapeDataString () แทน
jwaliszko

4
ใช้ WebUtility แทน HttpUtility เพื่อหลีกเลี่ยงการอ้างอิง System.Web HttpUtility ไม่มีอยู่ใน. NET Core
Steven De Kock

2
@ สตีฟคุณจะพิจารณาย่อหน้าสุดท้ายเป็นตัวหนาหรือไม่? ดูเหมือนว่าจะเป็นสิ่งสำคัญที่สุดที่ต้องรู้ในหน้านี้และต้องมีการเปิดเผยมากขึ้น
Timo

ดูคำตอบนี้สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง Uri.EscapeUriString และ Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Jason

21

HttpUtility.HtmlEncode/ ถอดรหัส
HttpUtility.UrlEncode/ ถอดรหัส

คุณสามารถเพิ่มการอ้างอิงไปยังSystem.Webแอสเซมบลีได้หากไม่มีในโครงการของคุณ


ฉันควรจะเจาะจงมากกว่านี้: สำหรับแอพ windows รายการเดียวที่มีใน SystemWeb คือ: AspNetHostingPermission, AspNetHostingPermissionAttribute และ AspNetHostingPermissionLevel
travis

5
คุณสามารถเพิ่มการอ้างอิงไปยังแอสเซมบลี System.Web
David Thibault

2
HtmlEncoding เป็นสิ่งที่แตกต่างอย่างสิ้นเชิง UrlEncode เป็น API ที่ไม่ใช้ความรู้สึกซึ่งไม่ควรใช้ การเข้ารหัส URL ทั้งหมดไม่สมเหตุสมผล (เว้นแต่ว่าคุณต้องการเข้ารหัสค่าเพื่อใช้เป็นพารามิเตอร์ แต่นั่นไม่ใช่สิ่งที่ทำ) ประเด็นของการเข้ารหัส / การหลีกเลี่ยงคือคุณกำลังสื่อว่าอักขระสงวนควรถูกส่งผ่านโดยไม่มีความหมายตามปกติ (เช่นระบุคิวรีหรือ & แยกพารามิเตอร์การสืบค้น) สิ่งนี้ต้องการความรู้ที่ UrlEncode ไม่มีและไม่สามารถมีได้
Brandon Paddock

18

ฉันพยายามทำอะนาล็อกที่เข้ากันได้เต็มรูปแบบของการเข้ารหัสของจาวาสคริปต์สำหรับ 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% 20 ที่นี่% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% เป็น% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

หลังจากที่คุณถอดรหัสด้วยการถอดรหัสของ JavascriptURLComponent ();

คุณจะได้รับสิ่งนี้: ! @ # $% ^ & * () _ + ข้อความบางส่วนที่นี่алимамедовбаку

ขอบคุณสำหรับความสนใจ


2
ใช้งานได้ แต่คุณสามารถใช้Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")แทนได้
mklement0

อันที่จริงUri.EscapeDataStringเข้ารหัสอักขระ '(' และ ')' ในขณะที่HttpUtility.UrlEncodeไม่ได้
Øystein Kolsrud


10

ลองServer.UrlEncode()หรือSystem.Web.HttpUtility.UrlEncode()สำหรับอินสแตนซ์เมื่อคุณไม่สามารถเข้าถึงServerวัตถุ คุณยังสามารถใช้System.Uri.EscapeUriString()เพื่อหลีกเลี่ยงการเพิ่มการอ้างอิงในSystem.Webแอสเซมบลี


1
Uri.EscapeUriString () ไม่ได้ทำอะไรให้ฉัน แต่ฉันสามารถเข้ารหัส URL ได้อย่างถูกต้องโดยใช้ Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: อันที่จริง เหตุผลนั้นUri.EscapeUriString()สอดคล้องกับของ JavaScript encodeURI()ซึ่งเก็บรักษาอักขระที่สงวนไว้ URI เช่น/, &... ตามที่เป็น (บวก#) ในขณะที่ - ตามที่คุณได้ค้นพบมันเป็นUri.EscapeDataString()ที่สอดคล้องกับ encodeURIComponent()JavaScript
mklement0

9

สำหรับแอพ Windows Store คุณจะไม่มี HttpUtility แต่คุณมี:

สำหรับ URI ก่อนหน้า "?":

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

สำหรับชื่อแบบสอบถาม URI หรือค่าหลัง "?":

  • ระบบ. Uri.EscapeDataString ("สแตกล้น ++")
    • -> "กอง% 20Overflow% 2B% 2B"

สำหรับชื่อหรือค่าคิวรี x-www-form-urlencodedในเนื้อหา POST:

  • System.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "กอง + ล้น% 2B% 2B"

6

คุณสามารถใช้อ็อบเจ็กต์ Server ในเนมสเปซ System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode และ Server.HtmlDecode

แก้ไข: โปสเตอร์เสริมว่านี่เป็นแอปพลิเคชัน windows ไม่ใช่เว็บอย่างที่ใคร ๆ เชื่อ รายการข้างต้นจะหาได้จากคลาส HttpUtility ภายใน System.Web ซึ่งจะต้องเพิ่มเป็นข้อมูลอ้างอิงของโปรเจ็กต์


1
วัตถุเซิร์ฟเวอร์ไม่สามารถเข้าถึงได้จากแอพ windows
travis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.