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

问题描述:

我有file://链接到非UTF-8中的UrlEncoded的非英文字符。要使这些链接在浏览器中工作,我必须对它们进行重新编码。从UTF-8编码为URL重新编码为ISO-8859-1编码

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); 
} 

是否有这样做的更清洁的方式?

+0

实际上,URI编码中使用的编码取决于服务器。 W3C建议使用UTF-8。但是...当你使用file:// URL时,浏览器就是服务器,所以这取决于浏览器......如果你打算在非西方平台(非ISO-8859-1)中使用它,请检查它。 .. – helios 2009-12-29 11:30:20

我认为这实际上很干净。它是可读的,你说它的功能正确。只要实施对消费者隐藏起来,我就不会担心会取消最后的改进。

如果你正在做这个操作过度(比如每个事件有数百个执行),我会考虑从UrlEncode/UrlDecode中取出实现并将它们流入对方,以通过消除字符串拆分来获得性能改进/加入,但测试将不得不证明,无论如何,肯定不会是“干净的”:-)

+0

我实际上会接受你的回答,因为似乎没有这样做的“更快”方式。正如你所说,它是可读的并表达了意图。 – 2010-01-06 08:51:16

尽管我没有看到任何改变它的真正方法,但它们会产生变化,不应该在空格替换之前加上UrlEncode,以便它变成%20?

+0

UrlEncode将把空间转换为+用于latin1编码。这就是为什么我用空间替换它。可以用%20代替+。 – 2009-12-18 13:45:59

不可否认的难看,而不是一个真正的进步,但可以重新编码整个事情(避免分裂/迭代/加入),然后.Replace(“%2F”,“/”)

我不理解希望在最终结果中保留空间的代码 - 看起来你最终不会得到实际编码的东西,如果它仍然有空格的话?

+0

空格使file://链接在IE中工作,以便在正确的位置打开文件。我可以使用前面评论中提到的%20,但+必须去。它不会工作。 – 2009-12-29 11:12:45

+0

而且它不会更干净,因为我需要替换%2f(/),%3a(:)和+(空格)。 – 2009-12-29 11:28:34