【问题标题】:Re-encode url from utf-8 encoded to iso-8859-1 encoded将 url 从 utf-8 编码重新编码为 iso-8859-1 编码
【发布时间】:2010-12-27 23:32:36
【问题描述】:

我有 file:// 链接,其中包含以 UTF-8 进行 UrlEncoded 的非英文字符。为了让这些链接在浏览器中工作,我必须重新编码它们。

file://development/H%C3%A5ndplukket.doc

变成

file://development/H%e5ndplukket.doc

我有以下有效的代码:

public string ReEncodeUrl(string url)
{
    Encoding enc = Encoding.GetEncoding("iso-8859-1");
    string[] parts = url.Split('/');
    for (int i = 1; i < parts.Length; i++)
    {
        parts[i] = HttpUtility.UrlDecode(parts[i]); // Decode to string
        parts[i] = HttpUtility.UrlEncode(parts[i], enc); // Re-encode to latin1
        parts[i] = parts[i].Replace('+', ' '); // Change + to [space]
    }
    return string.Join("/", parts);
}

有没有更清洁的方法?

【问题讨论】:

  • 实际上URI编码中使用的编码取决于服务器。 W3C 建议使用 UTF-8。但是...当您使用 file:// URL 时,浏览器就是服务器,因此这取决于浏览器...如果您打算在非西方平台(非 ISO-8859-1)中使用它,请检查一下。 ..

标签: c# utf-8 urlencode iso-8859-1 urldecode


【解决方案1】:

我认为这实际上很干净。它是可读的,你说它运行正常。只要实现对消费者隐藏,我就不会担心挤出最后的改进。

如果您过度执行此操作(例如每个事件执行数百次),我会考虑将实现从 UrlEncode/UrlDecode 中取出并将它们流式传输,以通过消除对字符串拆分的需要来提高性能/加入,但无论如何测试都必须证明这一点,而且绝对不会是“干净的”:-)

【讨论】:

  • 我实际上会接受您对此的回答,因为似乎没有“更快”的方式来做到这一点。正如你所说,它是可读的并且表达了意图。
【解决方案2】:

虽然我没有看到任何真正的改变它会产生影响的方法,但空格替换的 + 不应该在你的 UrlEncode 之前,所以它变成 %20 吗?

【讨论】:

  • UrlEncode 会将空格变为 + 用于 latin1 编码。这就是为什么我用空格替换它。可能已经用 %20 代替了 +。
【解决方案3】:

诚然丑陋,并没有真正的改进,但可以重新编码整个事情(避免拆分/迭代/加入)然后 .Replace("%2f", "/")

我不明白想要在最终结果中保留空格的代码 - 如果其中仍有空格,您似乎最终不会得到实际编码的东西?

【讨论】:

  • 空格使 file:// 链接在 IE 中工作,以便在正确的位置打开文件。正如我之前的评论中所述,我可能可以使用 %20 ,但必须使用 + 。它不会起作用。
  • 而且它不会更干净,因为我需要替换 %2f(/)、%3a(:) 和 +(space)。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多