【发布时间】:2010-12-04 15:42:37
【问题描述】:
如果我尝试将带有重音字符的 URL 放入函数中,例如“Percepção”,它会输出“Percep%C3%A7%C3%A3o”,这无法正常工作。但是,“Percep%e7%e3o”确实可以正常工作。
String Result = Uri.EscapeUriString("Percepção");
提前致谢。
【问题讨论】:
如果我尝试将带有重音字符的 URL 放入函数中,例如“Percepção”,它会输出“Percep%C3%A7%C3%A3o”,这无法正常工作。但是,“Percep%e7%e3o”确实可以正常工作。
String Result = Uri.EscapeUriString("Percepção");
提前致谢。
【问题讨论】:
首先将字符串编码为 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 更适合使用。)
【讨论】:
*Unescape*DataString(),而不是EscapeDataString()。事实上,在文章的结尾,他们建议使用EscapeDataString() 而不是HttpUtility.UrlEncode()。
我刚刚通过先将原始字符串编码为 ASCII 字节,然后将其编码回 UTF8 来解决此问题。
String Result = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("Percepção")));
感谢 binarycoder 提供更多细节。
【讨论】:
Uri.EscapeUriString() 不会转义& 或= 或?,也不会转义任何RFC 保留字符。这意味着如果您的查询参数包含任何这些字符,您将破坏您的 URL。所以看来Uri.EscapeDataString()是要使用的方法。
我让它工作的最后一种方式。使用此功能
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
【讨论】:
if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) {
param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();
}
很好的解决方案!
【讨论】: