我想创建一个机制(在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的思路思考,这本身也是一种欺骗。希望这是一个通用的“短文本压缩”问题。
答案 0 :(得分:8)
嗯,眼前的问题是:
这意味着如果您无法处理查询字符串中的(比方说)~1300个字符,则无法保证它始终有效。 (正如Marc所说,如果你可能的话,请使用POST的主体......那么你可能首先忽略压缩。)
如果你对这些人感到满意,那么你的情况与其他任何事情都没有什么不同:
Convert.ToBase64String
将压缩的字节转换回文本(然后替换web-nasty字符)另一方面,反过来应用相同的转换。
鉴于压缩API是基于流的,您可以使用StreamWriter
来避免首先从文本显式转换为二进制。
答案 1 :(得分: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));
}
}
}
}
答案 2 :(得分:0)
取决于消息的来源。如果它们都是你的,那么你就有了一个静态字典,你的查询字符串只需要几个字符。
我猜这个消息可以是任何东西,并且是用户生成的,在这种情况下,动态学习方法最甜蜜:跟踪用户放在那里的内容并随着你的进展调整你的压缩字典。使用一些不常见但URL安全的字符作为转义字符,以显示即将出现的字典键。
你可以通过从互联网上获取一些单词列表来播种它。 quick google应该找到最常见的100或1000个英语单词。