【问题标题】:Problem with Uri.EscapeUriString() regarding accented charactersUri.EscapeUriString() 关于重音字符的问题
【发布时间】:2010-12-04 15:42:37
【问题描述】:

如果我尝试将带有重音字符的 URL 放入函数中,例如“Percepção”,它会输出“Percep%C3%A7%C3%A3o”,这无法正常工作。但是,“Percep%e7%e3o”确实可以正常工作。

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

提前致谢。

【问题讨论】:

    标签: c# url .net-4.0 uri


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。我已经解决了这个问题,请参阅我对这个问题的回答。
    • 您确定要使用 Uri.EscapeDataString 吗?这表明您不应该:blogs.msdn.com/b/yangxind/archive/2006/11/09/…
    • @GordonThompson 那篇文章说不要使用*Unescape*DataString(),而不是EscapeDataString()。事实上,在文章的结尾,他们建议使用EscapeDataString() 而不是HttpUtility.UrlEncode()
    【解决方案2】:

    我刚刚通过先将原始字符串编码为 ASCII 字节,然后将其编码回 UTF8 来解决此问题。

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

    感谢 binarycoder 提供更多细节。

    【讨论】:

    • 请注意Uri.EscapeUriString() 不会转义&=?,也不会转义任何RFC 保留字符。这意味着如果您的查询参数包含任何这些字符,您将破坏您的 URL。所以看来Uri.EscapeDataString()是要使用的方法。
    【解决方案3】:

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

       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
    

    【讨论】:

      【解决方案4】:
      if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) {
          param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();                    
      }
      

      很好的解决方案!

      【讨论】:

      • 你能在这里澄清你的答案吗?
      • 我不确定这与我原来的问题有什么关系。
      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 2013-07-12
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2010-12-25
      • 2021-07-07
      相关资源
      最近更新 更多