Apakah C # setara dengan encodeURIComponent JavaScript ()?

135

Dalam JavaScript:

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

Apakah ada yang setara untuk aplikasi C #? Untuk keluar dari karakter HTML yang saya gunakan:

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

Tapi saya tidak yakin bagaimana mengubah kecocokan ke format heksadesimal yang benar yang digunakan JS. Misalnya kode ini:

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

Mengembalikan " %a9%221a"untuk "©√"bukannya "%C2%A9%E2%88%9A". Sepertinya saya perlu membagi string menjadi byte atau sesuatu.

Edit: ini adalah untuk aplikasi windows, satu-satunya item yang tersedia di System.Webadalah: AspNetHostingPermission, AspNetHostingPermissionAttribute, dan AspNetHostingPermissionLevel.

travis
sumber

Jawaban:

217

Uri.EscapeDataStringatau HttpUtility.UrlEncodeapakah cara yang benar untuk keluar dari string yang dimaksudkan untuk menjadi bagian dari URL.

Ambil contoh string "Stack Overflow":

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

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

  • Uri.EscapeDataString("Stack + Overflow")-> Juga mengkodekan "+" to "%2b"---->Stack%20%2B%20%20Overflow

Hanya yang terakhir yang benar ketika digunakan sebagai bagian sebenarnya dari URL (yang bertentangan dengan nilai salah satu parameter string kueri)

Steve
sumber
Masalah utama yang saya alami adalah tidak memiliki referensi ke System.Web dalam solusi saya, tapi saya tidak menyadari EscapeUriString, terima kasih!
travis
53
Berbeda dengan encodeURIComponent (), Uri.EscapeUriString () tidak menyandikan "+" ke "% 2b". Gunakan Uri.EscapeDataString () sebagai gantinya.
jwaliszko
4
Gunakan WebUtility alih-alih HttpUtility untuk menghindari keharusan mereferensikan System.Web. HttpUtility tidak ada di .NET Core.
Steven De Kock
2
@Steve Apakah Anda ingin membuat paragraf terakhir Anda tebal? Tampaknya menjadi hal yang paling penting untuk diketahui di halaman ini, dan perlu lebih banyak visibilitas.
Timo
Lihat juga jawaban ini untuk penjelasan lebih lanjut tentang perbedaan antara Uri.EscapeUriString dan Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Jason
20

HttpUtility.HtmlEncode/ Dekode
HttpUtility.UrlEncode/ Dekode

Anda dapat menambahkan referensi ke System.Webmajelis jika tidak tersedia di proyek Anda

David Thibault
sumber
Saya seharusnya lebih spesifik: Ini untuk aplikasi windows, satu-satunya item yang tersedia di System.Web adalah: AspNetHostingPermission, AspNetHostingPermissionAttribute, dan AspNetHostingPermissionLevel.
travis
5
Anda dapat menambahkan referensi ke perakitan System.Web
David Thibault
2
HtmlEncoding adalah hal yang sama sekali berbeda. UrlEncode adalah API non-sensis yang tidak boleh digunakan. Tidak masuk akal untuk menyandikan seluruh URL (kecuali jika Anda benar-benar ingin menyandikan nilainya untuk digunakan sebagai parameter - tapi bukan itu yang dilakukannya). Inti dari penyandian / pelolosan adalah Anda menyampaikan bahwa karakter yang dipesan harus dilewati tanpa makna yang biasa (mis.? Mengidentifikasi kueri, atau & memisahkan parameter kueri). Ini membutuhkan pengetahuan yang UrlEncode tidak dan tidak bisa miliki.
Brandon Paddock
18

Saya mencoba melakukan analog kompatibel penuh dari kode javascript encodeURICon untuk c # dan setelah 4 jam percobaan saya menemukan ini

c # KODE:

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

hasilnya adalah: !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20teks% 20di sini% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% menjadi% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Setelah Anda mendekodekannya dengan decodeURLComponent ();

Anda akan mendapatkan ini :! @ # $% ^ & * () _ + beberapa teks di sini али мамедов баку

Terima kasih atas perhatian Anda

Ali Mamedov
sumber
2
Berfungsi, tetapi Anda cukup menggunakan Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")saja.
mklement0
Sebenarnya, Uri.EscapeDataStringmengkodekan karakter '(' dan ')' sementara HttpUtility.UrlEncodetidak.
Øystein Kolsrud
12

System.Uri.EscapeUriString () sepertinya tidak melakukan apa-apa, tetapi System.Uri.Escape Data String () bekerja untuk saya.

Echilon
sumber
10

Coba Server.UrlEncode(), atau System.Web.HttpUtility.UrlEncode()sebagai contoh ketika Anda tidak memiliki akses ke Serverobjek. Anda juga dapat menggunakan System.Uri.EscapeUriString()untuk menghindari menambahkan referensi ke System.Webmajelis.

Billy Jo
sumber
1
Uri.EscapeUriString () tidak melakukan apa pun untuk saya, tetapi saya dapat dengan benar url-encode string menggunakan Uri.EscapeDataString ()
Toland Hon
3
@TolandHon: Memang. Alasannya adalah Uri.EscapeUriString()sesuai dengan JavaScript encodeURI()- yang mempertahankan karakter yang dilindungi undang-undang. seperti /, &, ... seperti apa (plus #), sedangkan - seperti yang Anda telah menemukan, itu adalah Uri.EscapeDataString()yang sesuai dengan JavaScript ini encodeURIComponent().
mklement0
8

Untuk Aplikasi Windows Store, Anda tidak akan memiliki HttpUtility. Sebaliknya, Anda memiliki:

Untuk URI, sebelum '?':

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

Untuk nama atau nilai permintaan URI, setelah '?':

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

Untuk nama atau nilai permintaan x-www-form-urlencoded , dalam konten POST:

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

Anda bisa menggunakan objek Server di namespace System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode, dan Server.HtmlDecode.

Sunting: poster menambahkan bahwa ini adalah aplikasi windows dan bukan aplikasi web seperti yang diyakini. Item yang tercantum di atas akan tersedia dari kelas HttpUtility di dalam System.Web yang harus ditambahkan sebagai referensi ke proyek.

Penjual Mitchel
sumber
1
Objek Server tidak dapat diakses dari aplikasi windows
travis