我想创建一个机制(在C#中),其中来自QueryString的文本显示在网站上.
例如,在C#中我可能真的会这样做;
public void Page_Load(blah) { litSomething.text = Reques.QueryString["msg"]; }
假设消息是用英语写的(允许UTF8很好),并且不超过1000个字符.我想尽可能地压缩这个文本,但仍然可以将它放在QueryString中.
我们可以预先定义尽可能多的字典术语(很好的理由?).服务器端代码将对消息进行编码和解码.
(显然我将添加所有常用的XSS保护,HttpUtitlity.HtmlEncode等类型的东西.还有指向免费字典源的指针会很好!)
任何提示,adivce,源代码?在你问之前,这不是我的功课!
更新
感谢您的建议.我想让这个GET,所以人们IM /电子邮件URL.我按照bit.ly的思路思考,这本身也是一种欺骗.希望这是一个通用的"短文本压缩"问题.
那么,眼前的问题是:
压缩的结果基本上是二进制的,所以你需要对它进行base64编码,这将使它再次变大1/3.(您也应该使用websafe base64编码.)
没有压缩算法总是会减小文本的大小
这意味着如果您无法处理查询字符串中的(例如)~1300个字符,则无法保证它始终有效.(正如Marc所说,如果可能的话,请使用POST的主体......那么你可能首先忽略压缩.)
如果你对这些人感到满意,那么你的情况与其他任何事情都没有什么不同:
将字符串编码为字节
压缩
使用Convert.ToBase64String
(然后替换web-nasty字符)将压缩的字节转换回文本
另一方面,反向应用相同的转换.
鉴于压缩API是基于流的,您可以使用StreamWriter
以避免首先显式地从文本转换为二进制.
您可以将字符串编码为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)); } } } }