2013-04-17 20 views
4

我覺得這很令人驚訝,而且很煩人。爲什麼HtmlEncode和HtmlDecode在.NET中不是同構的?

例子:

Decode(”) => 」 
Encode(」)  => 」 

相關類:

.NET 4: System.Net.WebUtility 
.NET 3.5: System.Web.HttpUtility 

我可以理解,一個網頁可以是Unicode,但我的情況下,輸出不能UTF8。

有沒有什麼(也許是一個HtmlWriter類),可以做到這一點,而我不必重新發明輪子?

替代解決方案:

string HtmlUnicodeEncode(string input) 
{ 
    var sb = new StringBuilder(); 

    foreach (var c in input) 
    { 
     if (c > 127) 
     { 
      sb.AppendFormat("&#x{0:X4};", (int)c); 
     } 
     else 
     { 
      sb.Append(c); 
     } 
    } 

    return sb.ToString(); 
} 
+3

這不是你在談論btw的冪。冪等性是f(f(x))= f(x)'的特性,這對於Encode(「)似乎是成立的。 –

+0

@ R.MartinhoFernandes:謝謝,我似乎誤解了這個意思。你能想出一個更好的術語嗎?也許是「可逆的」? – leppie

+2

我相信你期待這兩個是彼此相反的(因此他們會定義一個同構!)。 –

回答

8

這是不可能的,以產生一個同構HTML編解碼器對。試想一下:

HtmlDecode("”」”””") -> 」」」」」 

你怎麼從」」」」」回到原來的字符串?

HtmlEncode必須爲選擇一種編碼,並且它將作爲最短的,最可讀的替代方案來選擇。只要你有工作的Unicode,那幾乎肯定是最好的選擇。

如果你不這樣做,那是另一個論點...... ”的好處是它的可讀性比”略高,但它只能用於HTML(不是XML),並且你仍然必須回退到字符引用所有沒有內置實體名稱的Unicode字符,因此不太一致。對於字符參考編碼器,使用ASCII編碼創建一個XmlTextWriter並在其上調用writeString

+0

+1:好點:)我的問題是,輸出HTML不能是Unicode。猜猜我將不得不提出一個數據庫更改請求來支持Unicode。或者手動將Unicode字符編碼爲十六進制轉義符號。 – leppie

+0

+1我認爲這個答案應該被接受,並且在一個新的問答中處理後續問題 –

+1

絕對在你的數據庫中使用本地Unicode是一種方法,爲了確保數據庫函數像'LIKE'文本比較適用於Unicode字符串(並且因爲進出數據庫的編碼/解碼過程非常痛苦)。如果你使用SQL Server,通過使用'NVARCHAR'和'N''字符串來獲得Unicode支持應該很簡單。 – bobince

相關問題