将URL从UTF-8编码重新编码为ISO-8859-1编码。

4

我有一些包含非英文字符的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)中使用它,请检查一下... - helios
3个回答

1

我认为这很干净。它易读且你说它的功能正确。只要实现对消费者隐藏,我不会担心挤出最后一点改进。

如果您正在频繁执行此操作(例如每个事件都有数百次执行),我建议将实现从UrlEncode / UrlDecode中取出并将它们流式传输到彼此之间,以通过消除字符串分割/连接来获得性能提升,但测试必须证明其有效性,而且肯定不会“干净”:-)


我会接受你的答案,因为似乎没有更快的方法来完成这个任务。正如你所说,它易读且表达了意图。 - Mikael Svenson

0
虽然我看不出有任何真正的改变可以产生影响,但是应该在进行 UrlEncode 之前将 + 替换为空格,这样它就会变成 %20,对吗?

UrlEncode会将空格转换为+,适用于latin1编码。这就是为什么我用空格替换它的原因。也许可以用%20代替+。 - Mikael Svenson

0

诚然,这个方法看起来不太美观,也不能真正改善问题,但可以重新编码整个内容(避免分割/迭代/连接),然后使用.Replace("%2f", "/")。

我不明白为什么代码想在最终结果中保留空格——如果结果中仍然有空格的话,似乎就无法真正编码了?


空格使得file://链接在IE中能够正常工作,以便在正确的位置打开文件。我可能可以像我之前的评论中所述使用%20,但+必须去掉。它不起作用。 - Mikael Svenson
而且这并不是我需要的最简洁方式,因为我需要替换%2f(/)、%3a(:)和+(空格)。 - Mikael Svenson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接