2010-12-04 98 views
1

如果我尝试在带有重音字符的函数(如“Percepção”)中放置URL,则会输出“Percep%C3%A7%C3%A3o”,但不会正常工作。但是,“Percep%e7%e3o”确实按照它应该的方式工作。Uri.EscapeUriString()有关重音字符的问题

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

在此先感谢。

回答

2

我只是第一个编码原始字符串ASCII字节,然后编码回UTF8修复了这个问题。

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

感谢binarycoder一些更多的细节。

7

首先将字符串编码为UTF-8,然后将字节转换为文字字符或百分比编码序列。当一个新的URI方案定义了表示文本数据组成的部件

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

的标准是RFC3986,其中指出:

这可以通过比较的EscapeUriString到结果中可以看出来自通用字符集[UCS]的字符,首先应根据UTF-8字符编码[STD63]将数据编码为八位字节;那么只有那些与未保留集中的字符不相对应的八位字节应该进行百分比编码。

(顺便说一句,请注意Uri.EscapeDataString往往是更合适的比Uri.EscapeUriString使用。)

+0

感谢这个答案。我已经解决了这个问题,看到我对这个问题的回答。 – Codecat 2010-12-04 16:12:41

+1

您确定要使用Uri.EscapeDataString吗?这表明你不应该:http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding。 aspx – 2012-02-14 11:50:00

+0

@GordonThompson那篇文章是说不要使用`* Unescape * DataString()`,而不是`EscapeDataString()`。实际上,在文章结尾处,他们推荐使用`EscapeDataString()`而不是`HttpUtility.UrlEncode()`。 – 2015-11-11 00:24:53

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

好的解决方案!

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