2009-09-18 11 views
5

Voglio creare un meccanismo (in C#) in cui il testo di una QueryString viene visualizzato su un sito Web.Comprimi circa 1000 byte di testo per una QueryString

Ad esempio, in C# potrei letteralmente fare;

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

Si supponga che il messaggio è scritto in inglese (permettendo UTF8 sarebbe bello), e non più di 1000 caratteri dicono è. Voglio comprimere questo testo il più possibile ed essere ancora in grado di inserirlo in una QueryString.

Possiamo predefinire tutti i termini del dizionario che ci piacciono (anche se con-in motivo?). Il codice lato server codificherà e decodificherà i messaggi.

(Ovviamente sarò l'aggiunta di tutti i soliti protezione XSS, HttpUtitlity.HtmlEncode ecc roba tipo. Puntatori anche per liberare le fonti del dizionario sarebbe bene!)

Qualsiasi suggerimenti, adivce, il codice sorgente? Questo non è il mio compito prima di chiederlo!

Aggiornamento
Grazie per i suggerimenti. Voglio rendere questo un GET, quindi gli URL di IM/email delle persone. Sto pensando lungo le linee di bit.ly che sarebbe anche un imbroglio in sé. Volevo che si trattasse di una domanda generica di "short text compression".

+5

Consigli? Usa un POST qui ... –

risposta

8

Beh, i problemi immediati sono:

  • Il risultato di compressione è fondamentalmente sta per essere binario, quindi avrete bisogno di base64-codificare, che renderà 1/3 più grande di nuovo. (Si consiglia di utilizzare una codifica Base64 websafe troppo.)
  • Nessun algoritmo di compressione sarà sempre ridurre le dimensioni del testo

Questo significa che se non si può far fronte con (diciamo) ~ 1300 caratteri nella query stringa, non c'è garanzia che funzionerà sempre. (Come dice Marc, usa il corpo di un POST, se puoi ... allora probabilmente puoi ignorare la compressione in primo luogo.)

Se sei felice con quelli però, non c'è niente di particolarmente diverso nel tuo situazione di ogni altra:

  • Codifica la stringa in byte
  • Compress
  • Convertire i byte compressi in testo utilizzando Convert.ToBase64String (e quindi sostituire i caratteri web-nasty)

Dall'altro lato, applicare la stessa trasformazione al contrario.

Dato che l'API di compressione è basata sul flusso, è possibile utilizzare StreamWriter per evitare la conversione esplicita da testo a binario.

0

Dipende da dove provengono i messaggi. Se sono tutti tuoi, hai un dizionario statico e la stringa di query deve essere lunga solo un paio di caratteri.

Immagino che il messaggio potrebbe essere qualsiasi cosa e sarebbe generato dall'utente, nel qual caso un metodo di apprendimento dinamico sarebbe più dolce: tenere traccia di ciò che gli utenti inseriscono e regolare il dizionario di compressione man mano che si procede.Usa un carattere non comune ma sicuro per URL come carattere di escape per mostrare che c'è una chiave del dizionario in arrivo.

Si potrebbe seminare afferrando un elenco di parole da Internet. Un quick google dovrebbe trovare le parole più comuni di 100 o 1000 parole inglesi.

6

È possibile codificare la stringa come UTF-8 in modo da ottenere una matrice di byte che è possibile comprimere. Il risultato è anche un array di byte, in modo da poter utilizzare Base 64 codifica per ottenere come una stringa:

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()); 
    } 
} 

Decompressing è proprio il contrario:

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)); 
     } 
     } 
    } 
} 
Problemi correlati