Saya memiliki aplikasi yang mengirimkan permintaan POST ke perangkat lunak forum VB dan mencatat seseorang (tanpa mengatur cookie atau apa pun).
Setelah pengguna masuk saya membuat variabel yang membuat jalur di mesin lokal mereka.
c: \ tempfolder \ date \ username
Masalahnya adalah beberapa nama pengguna melempar pengecualian "karakter ilegal". Misalnya jika nama pengguna saya mas|fenix
itu akan membuang pengecualian ..
Path.Combine( _
Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _
DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username)
Saya tidak ingin menghapusnya dari string, tetapi folder dengan nama pengguna mereka dibuat melalui FTP di server. Dan ini mengarah ke pertanyaan kedua saya. Jika saya membuat folder di server, bisakah saya meninggalkan "karakter ilegal"? Saya hanya menanyakan ini karena servernya berbasis Linux, dan saya tidak yakin apakah Linux menerimanya atau tidak.
EDIT: Tampaknya penyandian URL BUKAN yang saya inginkan .. Inilah yang ingin saya lakukan:
old username = mas|fenix
new username = mas%xxfenix
Di mana% xx adalah nilai ASCII atau nilai lainnya yang akan dengan mudah mengidentifikasi karakter.
Jawaban:
Sunting: Perhatikan bahwa jawaban ini sekarang kedaluwarsa. Lihat jawaban Siarhei Kuchuk di bawah ini untuk perbaikan yang lebih baik
UrlEncoding akan melakukan apa yang Anda sarankan di sini. Dengan C #, Anda cukup menggunakan
HttpUtility
, seperti yang disebutkan.Anda juga dapat Regex karakter ilegal dan kemudian ganti, tetapi ini menjadi jauh lebih kompleks, karena Anda harus memiliki beberapa bentuk mesin negara (beralih ... kasus, misalnya) untuk mengganti dengan karakter yang benar. Karena
UrlEncode
melakukan ini di depan, itu agak mudah.Adapun Linux versus windows, ada beberapa karakter yang dapat diterima di Linux yang tidak ada di Windows, tapi saya tidak akan khawatir tentang itu, karena nama folder dapat dikembalikan dengan mendekode string Url, menggunakan
UrlDecode
, sehingga Anda dapat round trip perubahan.sumber
A potentially dangerous Request.Path value was detected from the client
.Saya telah bereksperimen dengan berbagai metode .NET menyediakan untuk pengkodean URL. Mungkin tabel berikut ini akan berguna (sebagai keluaran dari aplikasi uji yang saya tulis):
Kolom mewakili penyandian sebagai berikut:
UrlEkode:
HttpUtility.UrlEncode
UrlEncodedUnicode:
HttpUtility.UrlEncodeUnicode
UrlPathEncoded:
HttpUtility.UrlPathEncode
EscapedDataString:
Uri.EscapeDataString
EscapedUriString:
Uri.EscapeUriString
HtmlEkode:
HttpUtility.HtmlEncode
HtmlAttributeEncoded:
HttpUtility.HtmlAttributeEncode
HexEscaped:
Uri.HexEscape
CATATAN:
HexEscape
hanya dapat menangani 255 karakter pertama. Oleh karena itu ia mengeluarkanArgumentOutOfRange
pengecualian untuk karakter A-Extended Latin (misalnya Ā).Tabel ini dibuat di .NET 4.0 (lihat komentar Levi Botelho di bawah ini yang mengatakan penyandian dalam .NET 4.5 sedikit berbeda).
EDIT:
Saya telah menambahkan tabel kedua dengan penyandian untuk .NET 4.5. Lihat jawaban ini: https://stackoverflow.com/a/21771206/216440
EDIT 2:
Karena orang-orang tampaknya menghargai tabel ini, saya pikir Anda mungkin menyukai kode sumber yang menghasilkan tabel, sehingga Anda dapat bermain-main sendiri. Ini adalah aplikasi konsol C # sederhana, yang dapat menargetkan .NET 4.0 atau 4.5:
sumber
Uri.EscapeUriString
, tetapi waspadalah itu tidak mendukungnull
argumen.UrlPathEncode
. Jadi pada dasarnya gantikanUrlPathEncode
denganUri.EscapeUriString
.Anda harus menyandikan hanya nama pengguna atau bagian lain dari URL yang bisa tidak valid. Pengkodean URL dapat menyebabkan masalah karena sesuatu seperti ini:
Akan menghasilkan
Ini jelas tidak akan bekerja dengan baik. Sebagai gantinya, Anda harus menyandikan HANYA nilai pasangan kunci / nilai dalam string kueri, seperti ini:
Semoga itu bisa membantu. Juga, seperti yang disebutkan teedyay , Anda masih perlu memastikan karakter nama file ilegal dihapus atau sistem file tidak akan suka jalannya.
sumber
?
(karena mengasumsikan string kueri sudah dikodekan). Dalam contoh Dan Herbert sepertinya dia berpura-puraExample
adalah teks yang membutuhkan penyandian, jadiHttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");
tidak akan berfungsi. Cobalah dengan?q=Ex&ple
(di mana hasil yang diinginkan?q=Ex%26ple
). Ini tidak akan berfungsi karena (1) UrlPathEncode tidak menyentuh apa pun setelahnya?
, dan (2) UrlPathEncode tetap tidak menyandikan&
.&
, karena Anda perlu membatasi parameter string kueri Anda. Tapi ada kalanya Anda ingin ampersand yang disandikan juga.Cara yang lebih baik adalah menggunakan
Uri.EscapeUriString
untuk tidak merujuk Profil Lengkap .net 4.
sumber
Uri.EscapeDataString
TIDAKUri.EscapeUriString
Baca komentar ini, itu membantu saya keluar.Karena .NET Framework 4.5 dan .NET Standard 1.0 harus Anda gunakan
WebUtility.UrlEncode
. Keuntungan dibandingkan alternatif:Ini adalah bagian dari .NET Framework 4.5+, .NET Core 1.0+, .NET Standard 1.0+, UWP 10.0+ dan semua platform Xamarin juga.
HttpUtility
, sementara tersedia di .NET Framework sebelumnya (.NET Framework 1.1+), menjadi tersedia di platform lain jauh lebih baru (.NET Core 2.0+, .NET Standard 2.0+) dan masih belum tersedia di UWP (lihat pertanyaan terkait ).Dalam .NET Framework, ia berada di
System.dll
, sehingga tidak memerlukan referensi tambahan, tidak sepertiHttpUtility
.Itu benar lolos karakter untuk URL , tidak seperti
Uri.EscapeUriString
(lihat komentar untuk jawaban drweb86 ).Itu tidak memiliki batas pada panjang string , tidak seperti
Uri.EscapeDataString
(lihat pertanyaan terkait ), sehingga dapat digunakan untuk permintaan POST, misalnya.sumber
Levi Botelho berkomentar bahwa tabel penyandian yang sebelumnya dibuat tidak lagi akurat untuk .NET 4.5, karena penyandian sedikit berubah antara .NET 4.0 dan 4.5. Jadi saya telah membuat ulang tabel untuk .NET 4.5:
Kolom mewakili penyandian sebagai berikut:
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataString
Uri.EscapeUriString
HttpUtility.HtmlEncode
HttpUtility.HtmlAttributeEncode
WebUtility.HtmlEncode
Uri.HexEscape
CATATAN:
HexEscape hanya dapat menangani 255 karakter pertama. Oleh karena itu ia melempar pengecualian ArgumentOutOfRange untuk karakter A-Extended Latin (misalnya Ā).
Tabel ini dibuat di .NET 4.5 (lihat jawaban https://stackoverflow.com/a/11236038/216440 untuk penyandian yang relevan dengan .NET 4.0 dan di bawah).
EDIT:
sumber
(Net4.0) ? %3f................................
(Net4.5) ? %3f ..................................
Pengkodean URL mudah di .NET. Menggunakan:
Jika itu akan diterjemahkan untuk mendapatkan nama folder, Anda masih perlu mengecualikan karakter yang tidak dapat digunakan dalam nama folder (*,?, /, Dll.)
sumber
Jika Anda tidak dapat melihat System.Web, ubah pengaturan proyek Anda. Kerangka target harus ".NET Framework 4" alih-alih ".NET Framework 4 Profil Klien"
sumber
Implementasi .NET
UrlEncode
tidak sesuai dengan RFC 3986.Beberapa karakter tidak dikodekan tetapi harus. Para
!()*
karakter tercantum dalam RFC ini bagian 2.2 sebagai karakter pendiam yang harus dikodekan belum NET gagal untuk mengkodekan karakter ini.Beberapa karakter dikodekan tetapi tidak boleh. Para
.-_
karakter tidak terdaftar di bagian RFC 2.2 sebagai karakter pendiam yang tidak dikodekan belum NET keliru mengkodekan karakter ini.RFC menetapkan bahwa agar konsisten, implementasi harus menggunakan huruf besar HEXDIG, di mana .NET menghasilkan huruf kecil HEXDIG.
sumber
Saya pikir orang-orang di sini teralihkan oleh pesan UrlEncode. URLEncoding bukan yang Anda inginkan - Anda ingin menyandikan hal-hal yang tidak akan berfungsi sebagai nama file pada sistem target.
Dengan asumsi bahwa Anda ingin generalisasi - jangan ragu untuk menemukan karakter ilegal di beberapa sistem (MacOS, Windows, Linux dan Unix), gabungkan mereka untuk membentuk serangkaian karakter untuk melarikan diri.
Sedangkan untuk pelarian, HexEscape harus baik-baik saja (Mengganti karakter dengan% XX). Ubah setiap karakter menjadi UTF-8 byte dan enkode semuanya> 128 jika Anda ingin mendukung sistem yang tidak melakukan unicode. Tetapi ada cara lain, seperti menggunakan back slash "\" atau HTML encoding "" ". Anda dapat membuatnya sendiri. Yang harus dilakukan oleh sistem adalah 'menyandikan' karakter yang tidak kompatibel tersebut. Sistem di atas memungkinkan Anda untuk membuat ulang nama asli - tetapi sesuatu seperti mengganti karakter buruk dengan spasi juga berfungsi.
Pada garis singgung yang sama seperti di atas, satu-satunya yang digunakan adalah
- Ini mengkodekan semua yang diperlukan untuk OAuth, itu tidak mengkodekan hal-hal yang OAuth melarang pengkodean, dan menyandikan ruang sebagai% 20 dan bukan + (Juga dalam Spesifikasi OATH) Lihat: RFC 3986. AFAIK, ini adalah spesifikasi URI terbaru.
sumber
Saya telah menulis metode C # yang url-encode SEMUA simbol:
sumber
Idealnya ini akan masuk dalam kelas yang disebut "FileNaming" atau mungkin hanya mengubah nama Encode menjadi "FileNameEncode". Catatan: ini tidak dirancang untuk menangani Jalur Lengkap, hanya folder dan / atau nama file. Idealnya Anda akan Membagi ("/") path lengkap Anda terlebih dahulu dan kemudian memeriksa bagian. Dan jelas, alih-alih gabungan, Anda bisa menambahkan karakter "%" ke daftar karakter yang tidak diizinkan di Windows, tapi saya pikir ini lebih membantu / dapat dibaca / faktual dengan cara ini. Decode () persis sama tetapi mengganti Replace (Uri.HexEscape (s [0]), s) "lolos" dengan karakter.
Terima kasih @ simon-tewsi untuk tabel yang sangat berguna di atas!
sumber
Path.GetInvalidFileNameChars()
Selain jawaban @Dan Herbert, Anda harus menyandikan nilai secara umum saja.
Split memiliki parameter parameter Split ('&', '='); ekspresi pertama-tama dipisah oleh & kemudian '=' sehingga elemen ganjil adalah semua nilai yang akan dikodekan ditunjukkan di bawah.
sumber