如果我尝试在带有重音字符的函数中添加URL,例如“Percepção”,则会输出“Percep%C3%A7%C3%A3o”,这不能正常工作。但是,“Percep%e7%e3o”确实按预期方式工作。
String Result = Uri.EscapeUriString("Percepção");
提前致谢。
答案 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();
}
好解决方案!!