2009-12-18 84 views
4

我有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

回答

1

我認爲這實際上很乾淨。它是可讀的,你說它的功能正確。只要實施對消費者隱藏起來,我就不會擔心會取消最後的改進。

如果你正在做這個操作過度(比如每個事件有數百個執行),我會考慮從UrlEncode/UrlDecode中取出實現並將它們流入對方,以通過消除字符串拆分來獲得性能改進/加入,但測試將不得不證明,無論如何,肯定不會是「乾淨的」:-)

+0

我實際上會接受你的回答,因爲似乎沒有這樣做的「更快」方式。正如你所說,它是可讀的並表達了意圖。 – 2010-01-06 08:51:16

0

儘管我沒有看到任何改變它的真正方法,但它們會產生變化,不應該在空格替換之前加上UrlEncode,以便它變成%20?

+0

UrlEncode將把空間轉換爲+用於latin1編碼。這就是爲什麼我用空間替換它。可以用%20代替+。 – 2009-12-18 13:45:59

0

不可否認的難看,而不是一個真正的進步,但可以重新編碼整個事情(避免分裂/迭代/加入),然後.Replace(「%2F」,「/」)

我不理解希望在最終結果中保留空間的代碼 - 看起來你最終不會得到實際編碼的東西,如果它仍然有空格的話?

+0

空格使file://鏈接在IE中工作,以便在正確的位置打開文件。我可以使用前面評論中提到的%20,但+必須去。它不會工作。 – 2009-12-29 11:12:45

+0

而且它不會更乾淨,因爲我需要替換%2f(/),%3a(:)和+(空格)。 – 2009-12-29 11:28:34