2009-09-18 55 views
5

約1000個字節的文本,我想創建一個機構的(C#),其中從查詢字符串文本顯示在網站上。壓縮的查詢字符串

例如,在C#中我可能從字面上做;

public void Page_Load(blah) 
{ 
     litSomething.text = Reques.QueryString["msg"]; 
} 

假設消息是用英文寫的(允許UTF8會很好),並且不超過1000個字符。我想盡可能壓縮這些文本,並且仍然可以將它放在QueryString中。

因爲我們喜歡,我們可以預先設置儘可能多的詞典術語(井:在原因?)。服務器端代碼將對消息進行編碼和解碼。

(很顯然,我會在所有常見的XSS保護加入,HttpUtitlity.HtmlEncode等類型的東西。同時指針到詞典來源將是一件好事!)

任何提示,書於,源代碼?在你問之前,這不是我的功課!

更新
感謝您的建議。我想讓這個GET,所以人們IM /電子郵件URL。我正在思考bit.ly,這本身也是一個騙子。希望這是一個通用的「短文本壓縮」問題。

+5

提示?在這裏使用POST ... – 2009-09-18 16:41:21

回答

8

好了,眼前的問題是:

  • 壓縮的結果基本上將是二進制的,所以您需要爲Base64編碼它,這將1/3做大再次做到這一點。 (您應該使用網絡安全base64編碼過。)
  • 沒有壓縮算法會一直減少文本的大小

這意味着,如果你不能與(比如說)〜查詢1300個字符應對字符串,並不能保證它總能正常工作。 (正如馬克說,用身體一個POST而不是你所能...那麼你可能忽略首先壓縮。)

如果你喜歡這些雖然,有沒有什麼特別不同的是關於你的形勢比任何其他:

  • 編碼字符串轉換成字節
  • 壓縮
  • 轉換使用Convert.ToBase64String壓縮字節迴文本(然後更換網絡討厭字符)

另一方面,反向應用相同的轉換。

鑑於壓縮API是基於流的,你可以使用StreamWriter避免明確從文本轉換第一個二進制文件。

0

取決於消息來自何處。如果它們都是你的,那麼你有一個靜態字典,你的查詢字符串只需要幾個字符長。

我想這個消息可能是任何東西,並且會是用戶生成的,在這種情況下,動態學習方法會變得最甜蜜:跟蹤用戶放入的內容並隨時調整壓縮字典。使用一些不常見的但是URL安全的字符作爲轉義字符來顯示字典鍵出現。

你可以通過從互聯網上抓取一些單詞列表來種子。 A quick google應該爲您找到最常見的100或1000個英文單詞。

6

您可以將字符串編碼爲UTF-8,以便獲得可以壓縮的字節數組。其結果也是一個字節數組,所以你可以使用的Base-64編碼把它作爲一個字符串:

private static string Compress(string data) { 
    using (MemoryStream ms = new MemoryStream()) { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) { 
     zip.Write(Encoding.UTF8.GetBytes(data), 0, data.Length); 
     } 
     return Convert.ToBase64String(ms.ToArray()); 
    } 
} 

解壓只是周圍的其他方法:

private static string Decompress(string data) { 
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(data))) { 
     using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress, true)) { 
     using (BinaryReader reader = new BinaryReader(zip)) { 
      return Encoding.UTF8.GetString(reader.ReadBytes(10000)); 
     } 
     } 
    } 
}