C # có tương đương với encodeURIComponent () của JavaScript không?


135

Trong JavaScript:

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

Có tương đương cho các ứng dụng C # không? Để thoát các ký tự HTML tôi đã sử dụng:

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

Nhưng tôi không chắc làm thế nào để chuyển đổi trận đấu sang định dạng thập lục phân chính xác mà JS sử dụng. Ví dụ mã này:

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

Thu nhập " %a9%221a"cho "©√"thay "%C2%A9%E2%88%9A". Dường như tôi cần phải chia chuỗi thành byte hoặc một cái gì đó.

Chỉnh sửa: Đây là một ứng dụng cửa sổ, các mặt hàng chỉ có sẵn trong System.Weblà: AspNetHostingPermission, AspNetHostingPermissionAttribute, và AspNetHostingPermissionLevel.

Câu trả lời:


217

Uri.EscapeDataStringhoặc HttpUtility.UrlEncodelà cách chính xác để thoát một chuỗi có nghĩa là một phần của URL.

Lấy ví dụ chuỗi "Stack Overflow":

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

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

  • Uri.EscapeDataString("Stack + Overflow")-> Cũng mã hóa "+" to "%2b"---->Stack%20%2B%20%20Overflow

Chỉ cuối cùng là chính xác khi được sử dụng như một phần thực tế của URL (trái ngược với giá trị của một trong các tham số chuỗi truy vấn)


Vấn đề chính tôi gặp phải là không có tài liệu tham khảo về System.Web trong giải pháp của mình, nhưng tôi không biết về EscapeUriString, cảm ơn!
ngày

53
Ngược lại với encodeURIComponent (), Uri.EscapeUriString () không mã hóa "+" thành "% 2b". Sử dụng Uri.EscapeDataString () thay thế.
jwaliszko

4
Sử dụng WebUtility thay vì httpUtility để tránh phải tham khảo System.Web. HttpUtility không tồn tại trong .NET Core.
Steven De Kock

2
@Steve Bạn có cân nhắc làm cho đoạn cuối của bạn in đậm không? Nó dường như là điều quan trọng nhất cần biết trên trang này, và nó cần nhiều khả năng hiển thị hơn.
Timo

Đồng thời xem câu trả lời này để được giải thích thêm về sự khác biệt giữa Uri.EscapeUriString và Uri.EscapeDataString: stackoverflow.com/questions/4396598/
Jason

20

HttpUtility.HtmlEncode/ Giải mã
HttpUtility.UrlEncode/ Giải mã

Bạn có thể thêm một tham chiếu đến System.Webhội đồng nếu nó không có sẵn trong dự án của bạn


Tôi nên nói cụ thể hơn: Đây là một ứng dụng Windows, các mục duy nhất có sẵn trong System.Web là: AspNethostingPermission, AspNethostingPermissionAttribution và AspNethostingPermissionLevel.
ngày

5
Bạn có thể thêm một tham chiếu đến hội đồng System.Web
David Thibault

2
HtmlEncoding là một điều hoàn toàn khác. UrlEncode là một API không nhạy cảm không bao giờ nên được sử dụng. Sẽ không có ý nghĩa khi mã hóa toàn bộ URL (trừ khi bạn thực sự muốn mã hóa giá trị của nó để sử dụng làm tham số - nhưng đó không phải là điều này). Điểm mã hóa / thoát là bạn đang truyền đạt rằng một ký tự dành riêng phải được chuyển qua mà không có ý nghĩa thông thường của nó (ví dụ: xác định truy vấn hoặc & tách các tham số truy vấn). Điều này đòi hỏi kiến ​​thức mà UrlEncode không và không thể có.
Brandon Paddock

18

Tôi đã cố gắng thực hiện tương tự đầy đủ tương tự mã hóa của javascript cho c # và sau 4 giờ thử nghiệm của tôi, tôi đã tìm thấy điều này

c # MÃ:

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

kết quả là : !% 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% được% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Sau khi bạn giải mã nó với decodeURLComponent () của Javascript;

bạn sẽ nhận được điều này : ! @ # $% ^ & * () _ + một số văn bản tại đây.

Cảm ơn bạn đã chú ý


2
Hoạt động, nhưng bạn chỉ có thể sử dụng Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")thay thế.
mkuity0

Trên thực tế, Uri.EscapeDataStringmã hóa các ký tự '(' và ')' trong khi HttpUtility.UrlEncodekhông.
Øystein Kolsrud

12

System.Uri.EscapeUriString () dường như không làm gì cả, nhưng System.Uri.Escape Data String () làm việc cho tôi.


10

Hãy thử Server.UrlEncode()hoặc System.Web.HttpUtility.UrlEncode()ví dụ khi bạn không có quyền truy cập vào Serverđối tượng. Bạn cũng có thể sử dụng System.Uri.EscapeUriString()để tránh thêm một tham chiếu đến System.Weblắp ráp.


1
Uri.EscapeUriString () không làm gì cho tôi, nhưng tôi đã có thể mã hóa url đúng cách bằng cách sử dụng Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: Thật vậy. Lý do là Uri.EscapeUriString()tương ứng với JavaScript encodeURI()- bảo tồn các ký tự dành riêng cho URI. chẳng hạn như /, &... như hiện tại (cộng #), trong khi - như bạn đã khám phá ra, nó Uri.EscapeDataString()tương ứng với JavaScript encodeURIComponent().
mkuity0

8

Đối với Ứng dụng Windows Store, bạn sẽ không có httpUtility. Thay vào đó, bạn có:

Đối với một URI, trước '?':

  • Hệ thống. Uri.EscapeUriString ("example.com/Stack ++?")
    • -> "example.com/Stack%20Overflow++?"

Đối với tên hoặc giá trị truy vấn URI, sau dấu '?':

  • Hệ thống. Uri.EscapeDataString ("Chồng tràn ++")
    • -> "Ngăn xếp% 20Overflow% 2B% 2B"

Đối với tên hoặc giá trị truy vấn x-www-form-urlencoding , trong nội dung POST:

  • Hệ thống.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "Chồng + tràn% 2B% 2B"

6

Bạn có thể sử dụng đối tượng Máy chủ trong không gian tên System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode và Server.HtmlDecode.

Chỉnh sửa: poster thêm rằng đây là một ứng dụng Windows chứ không phải là một trang web như người ta có thể tin. Các mục được liệt kê ở trên sẽ có sẵn từ lớp HttpUtility bên trong System.Web, phải được thêm vào như một tài liệu tham khảo cho dự án.


1
Đối tượng Máy chủ không thể truy cập được từ ứng dụng Windows
travis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.