Чи C # має еквівалент коду JavaScriptURIComponent ()?


135

У 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". Схоже, мені потрібно розділити рядок на байти чи щось.

Edit: Це для додатка вікон, тільки елементи , доступні в System.Webє: AspNetHostingPermission, AspNetHostingPermissionAttribute, і AspNetHostingPermissionLevel.

Відповіді:


217

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

53
На відміну від encodeURIComponent (), Uri.EscapeUriString () не кодує "+" до "% 2b". Використовуйте натомість Uri.EscapeDataString ().
jwaliszko

4
Використовуйте WebUtility замість HttpUtility, щоб не мати посилання на System.Web. HttpUtility не існує в .NET Core.
Стівен Де Кок

2
@Steve Ви хотіли б зробити свій останній абзац жирним? Здається, це найголовніше, що потрібно знати на цій сторінці, і вона потребує більшої видимості.
Тимо

Також дивіться відповідь для більш докладного пояснення про різницю між Uri.EscapeUriString і Uri.EscapeDataString: stackoverflow.com/questions/4396598 / ...
Джейсон

20

HttpUtility.HtmlEncode/ Розшифрувати
HttpUtility.UrlEncode/ Розшифрувати

Ви можете додати посилання на System.Webзбірку, якщо вона недоступна у вашому проекті


Я повинен був бути більш конкретним: це для додатка Windows, єдиними елементами, доступними в System.Web є: AspNetHostingPermission, AspNetHostingPermissionAttribute та AspNetHostingPermissionLevel.
травіс

5
Ви можете додати посилання на збірку System.Web
David Thibault,

2
HtmlEncoding - зовсім інша річ. UrlEncode - це нечуттєвий API, який ніколи не слід використовувати. Немає сенсу кодувати цілу URL-адресу (якщо ви насправді не хочете кодувати її значення для використання в якості параметра - але це не так). Сенс кодування / уникнення полягає в тому, що ви повідомляєте, що зарезервований символ повинен бути переданий без його звичайного значення (наприклад, що "ідентифікує запит або & розділяє параметри запиту"). Для цього потрібні знання, яких UrlEncode не має і не може мати.
Брендон Паддок

18

Я спробував зробити повний сумісний аналог кодування JavaScript наURIComponent для 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

12

System.Uri.EscapeUriString (), схоже, нічого не робив, але System.Uri.Escape Data String () працював на мене.


10

Спробуйте Server.UrlEncode(), або System.Web.HttpUtility.UrlEncode()для випадків, коли у вас немає доступу до Serverоб'єкта. Ви також можете використовувати, System.Uri.EscapeUriString()щоб не додавати посилання на System.Webзбірку.


1
Uri.EscapeUriString () нічого не зробив для мене, але мені вдалося належним чином зашифрувати URL-адреси за допомогою URL-адреси Uri.EscapeDataString ()
Toland Hon,

3
@TolandHon: Дійсно. Причина полягає в тому, що Uri.EscapeUriString()відповідає JavaScript encodeURI()- це зберігає URI-зарезервовані символи. такі як /, &... як є (плюс #), в той час як - як ви виявили, що Uri.EscapeDataString()що відповідає в JavaScript encodeURIComponent().
mklement0

8

Для додатка Windows Store у вас не буде програми HttpUtility. Натомість у вас є:

Для URI перед "?":

  • Система. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

Для імені або значення запиту URI після "?":

  • Система. Uri.EscapeDataString ("Переповнення стека ++")
    • -> "Стек% 20Потоки% 2B% 2B"

Для імені або значення запиту x-www-form-urlencoded , у вмісті POST:

  • System.Net. WebUtility.UrlEncode ("Переповнення стека ++")
    • -> "Стек + Переповнення% 2B% 2B"

6

Ви можете використовувати об’єкт Server у просторі імен System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode та Server.HtmlDecode.

Редагувати: плакат додав, що це програма для Windows, а не веб-версія, як можна було б вважати. Перелічені вище елементи будуть доступні у класі HttpUtility всередині System.Web, який потрібно додати як посилання на проект.


1
Об'єкт Сервера недоступний через додаток Windows
travis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.