2009-09-18 57 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)); 
     } 
     } 
    } 
}