如果我嘗試在帶有重音字符的函數(如「Percepção」)中放置URL,則會輸出「Percep%C3%A7%C3%A3o」,但不會正常工作。但是,「Percep%e7%e3o」確實按照它應該的方式工作。Uri.EscapeUriString()有關重音字符的問題
String Result = Uri.EscapeUriString("Percepção");
在此先感謝。
如果我嘗試在帶有重音字符的函數(如「Percepção」)中放置URL,則會輸出「Percep%C3%A7%C3%A3o」,但不會正常工作。但是,「Percep%e7%e3o」確實按照它應該的方式工作。Uri.EscapeUriString()有關重音字符的問題
String Result = Uri.EscapeUriString("Percepção");
在此先感謝。
我只是第一個編碼原始字符串ASCII字節,然後編碼回UTF8修復了這個問題。
String Result = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("Percepção")));
感謝binarycoder一些更多的細節。
首先將字符串編碼爲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
使用。)
if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) {
param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();
}
好的解決方案!
我得到它的最後一種方式。使用此功能
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
感謝這個答案。我已經解決了這個問題,看到我對這個問題的回答。 – Codecat 2010-12-04 16:12:41
您確定要使用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
@GordonThompson那篇文章是說不要使用`* Unescape * DataString()`,而不是`EscapeDataString()`。實際上,在文章結尾處,他們推薦使用`EscapeDataString()`而不是`HttpUtility.UrlEncode()`。 – 2015-11-11 00:24:53