从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);
}
是否有这样做的更清洁的方式?
我认为这实际上很干净。它是可读的,你说它的功能正确。只要实施对消费者隐藏起来,我就不会担心会取消最后的改进。
如果你正在做这个操作过度(比如每个事件有数百个执行),我会考虑从UrlEncode/UrlDecode中取出实现并将它们流入对方,以通过消除字符串拆分来获得性能改进/加入,但测试将不得不证明,无论如何,肯定不会是“干净的”:-)
我实际上会接受你的回答,因为似乎没有这样做的“更快”方式。正如你所说,它是可读的并表达了意图。 – 2010-01-06 08:51:16
尽管我没有看到任何改变它的真正方法,但它们会产生变化,不应该在空格替换之前加上UrlEncode,以便它变成%20?
UrlEncode将把空间转换为+用于latin1编码。这就是为什么我用空间替换它。可以用%20代替+。 – 2009-12-18 13:45:59
不可否认的难看,而不是一个真正的进步,但可以重新编码整个事情(避免分裂/迭代/加入),然后.Replace(“%2F”,“/”)
我不理解希望在最终结果中保留空间的代码 - 看起来你最终不会得到实际编码的东西,如果它仍然有空格的话?
空格使file://链接在IE中工作,以便在正确的位置打开文件。我可以使用前面评论中提到的%20,但+必须去。它不会工作。 – 2009-12-29 11:12:45
而且它不会更干净,因为我需要替换%2f(/),%3a(:)和+(空格)。 – 2009-12-29 11:28:34
实际上,URI编码中使用的编码取决于服务器。 W3C建议使用UTF-8。但是...当你使用file:// URL时,浏览器就是服务器,所以这取决于浏览器......如果你打算在非西方平台(非ISO-8859-1)中使用它,请检查它。 .. – helios 2009-12-29 11:30:20