Проблема с Uri.EscapeUriString () в отношении акцентированных символов - PullRequest
1 голос
/ 04 декабря 2010

Если я попытаюсь поместить URL-адрес в функцию с акцентированными символами, например, «Percepção», он выдаст «Percep% C3% A7% C3% A3o», который работает неправильно. Однако «Percep% e7% e3o» работает так, как должен.

String Result = Uri.EscapeUriString("Percepção");

Заранее спасибо.

Ответы [ 4 ]

7 голосов
/ 04 декабря 2010

Строка сначала кодируется как UTF-8, а затем байты преобразуются в буквенные символы или процентные последовательности.

Это можно увидеть, сравнив результат EscapeUriString с:

Console.WriteLine(BitConverter.ToString(Encoding.UTF8.GetBytes("Percepção")));
// 50-65-72-63-65-70-C3-A7-C3-A3-6F

Стандарт RFC3986 , который гласит:

Когда новая схема URI определяет компонент, который представляет текстовые данные, состоящие из символов из универсального набора символов [UCS], данные должны быть сначала закодированы как октеты в соответствии с кодировкой символов UTF-8 [STD63];тогда только те октеты, которые не соответствуют символам в незарезервированном наборе, должны быть закодированы в процентах.

(Кроме того, обратите внимание, что Uri.EscapeDataString часто более подходит для использования, чем Uri.EscapeUriString.)

2 голосов
/ 04 декабря 2010

Я только что исправил эту проблему, сначала кодируя исходную строку в байты ASCII, а затем кодируя ее обратно в UTF8.

String Result = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("Percepção")));

Спасибо двоичному кодеру за некоторые подробности.

0 голосов
/ 15 ноября 2013

Последний способ заставить его работать.Используйте эту функцию

   Function UriEncode(ByVal cText As String) As String
      Dim cRes As String = ""
      For Each iBy As Byte In Encoding.GetEncoding(1252).GetBytes(cText)
         Select Case iBy
            Case Asc("%")
               cRes &= "%25"
            Case Asc(" ")
               cRes &= "+"
            Case Is > 127
               cRes &= "%" & Hex(iBy)
            Case Else
               cRes &= Convert.ToChar(iBy)
         End Select
      Next
      Return cRes
   End Function

Если вы запустите:

   MsgBox(UriEncode("Percepção"))

Вы получите

   Percep%E7%E3o
0 голосов
/ 09 мая 2013
if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) {
    param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();                    
}

ХОРОШЕЕ РЕШЕНИЕ !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...