关于重音字符的Uri.EscapeUriString()问题

时间:2010-12-04 15:42:37

标签: c# url .net-4.0 uri

如果我尝试在带有重音字符的函数中添加URL,例如“Percepção”,则会输出“Percep%C3%A7%C3%A3o”,这不能正常工作。但是,“Percep%e7%e3o”确实按预期方式工作。

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

提前致谢。

4 个答案:

答案 0 :(得分:7)

首先将字符串编码为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更适合使用。)

答案 1 :(得分:2)

我刚刚解决了这个问题,首先将原始字符串编码为ASCII字节,然后将其编码回UTF8。

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

感谢二进制编码器提供更多细节。

答案 2 :(得分:0)

我让它运转的最后一种方式。使用此功能

   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

答案 3 :(得分:-1)

if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) {
    param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();                    
}

好解决方案!!