2008-09-17 10 views
87

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

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

Có tương đương cho các ứng dụng C#? Để 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 biết cách chuyển đổi khớp với đị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]))); 

Returns "%a9%221a" cho "©√" thay vì "%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ổ, chỉ mục có sẵn trong System.Web là:. AspNetHostingPermission, AspNetHostingPermissionAttribute, và AspNetHostingPermissionLevel

Trả lời

144

Uri.EscapeDataString hoặc HttpUtility.UrlEncode là cách đúng để thoát khỏi chuỗi có nghĩa là một phần của URL.

Đưa ví dụ chuỗi "Stack Overflow":

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

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

  • Uri.EscapeDataString("Stack + Overflow") -> Ngoài ra mã hóa "+" to "%2b" ---->Stack%20%2B%20%20Overflow

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

+0

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

+42

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

+0

@Steve Uri.EscapeDataString đã lưu ngày của chúng tôi;) – InferOn

16

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

Bạn có thể thêm một tham chiếu đến assembly System.Web nếu nó không có sẵn trong dự án

+0

tôi nên đã cụ thể hơn: Đây là một ứng dụng cửa sổ, các mặt hàng chỉ có sẵn trong System.Web là: AspNetHostingPermission, AspNetHostingPermissionAttribute và AspNetHostingPermissionLevel. – travis

+4

Bạn có thể thêm tham chiếu đến assembly System.Web –

+0

Tôi vừa nhận ra điều đó, cảm ơn! – travis

5

Bạn có thể sử dụng đối tượng Server trong namespace System.Web

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

Chỉnh sửa: áp phích đã thêm rằng đây là ứng dụng cửa sổ và không phải là ứng dụng trên web mà bạn tin tưởng. Các mục được liệt kê ở trên sẽ có sẵn từ lớp HttpUtility bên trong System.Web và phải được thêm làm tham chiếu đến dự án.

+0

Đối tượng Máy chủ không truy cập được từ một ứng dụng windows – travis

9

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

+1

Uri.EscapeUriString() không làm bất cứ điều gì cho tôi, nhưng tôi đã có thể mã hóa url đúng cách bằng Uri.EscapeDataString() –

+1

@TolandHon: Thật vậy. Lý do là 'Uri.EscapeUriString()' tương ứng với 'encodeURI()' của JavaScript - giữ lại các ký tự được đặt trước của URI. chẳng hạn như '/', '&', ... as-is (cộng '#'), trong khi - như bạn đã khám phá, nó là 'Uri.EscapeDataString()' tương ứng với 'encodeURIComponent()' của JavaScript. – mklement0

9

System.Uri.EscapeUriString() dường như không làm gì cả, nhưng System.Uri.Escape Dữ liệu String() đã hoạt động đối với tôi.

13

Tôi cố gắng làm đầy đủ analog tương thích của encodeURIComponent javascript cho C# và sau 4 thí nghiệm giờ tôi thấy điều này

C# Mã sản phẩm:

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

kết quả là: % 40% 23% 24% 25% 5e% 26 *() _% 2b% 20so tôi% 20text% 20tại% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% là% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

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

bạn sẽ có được điều này: @ # $%^& *() _ + một số văn bản ở đây али мамедов баку

cảm ơn đã quan tâm

+1

+1 để tôn trọng từ" tương đương "trong câu hỏi. Tôi đã chuyển đổi một số thuật toán JavaScript sang VB.NET và câu trả lời này hữu ích. – Fuhrmanator

+1

Hoạt động, nhưng bạn chỉ có thể sử dụng 'Uri.EscapeDataString ("! @ # $%^& *() _ + Một số văn bản ở đây али мамедов баку ")' thay thế. – mklement0

4

Đối với một Windows Store App, bạn thắng không có HttpUtility. Thay vào đó, bạn có:

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

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

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

  • System. Uri.EscapeDataString ("Stack Overflow ++")
    • -> "Stack% 20Overflow% 2B% 2B"

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

  • System.Net. Tính linh hoạt của web.URLEncode ("Stack Overflow ++")
    • -> "Stack + Overflow% 2B% 2B"