Generalized compression algorithms are probably going to be one of the last resorts or used only for a lazy attempt to try and compress unless you are sending pre-constructed data (file transfers, images, etc). If you have control over the data being sent, I reccomend you check out using a bit stream combined with prediction, deltas and value ranges.
Prediction: Lets say you have a common default value - this can be just about anything. Lets say your characters can change the color of their skin - R, G and B all on a 0-255 range. This takes 3 bytes. But a good chunk of players, maybe about 25%, still use the default color. You can have a bit for a boolean stating that "if true, use the default color, else read the next 3 bytes for the color". You can extend this to add more values, even weigh them by the rate of occurance using a Huffman or Algorithmic style weight distribution.
Deltas: This one is a bit harder to make use of and also will have to go under the assumption that the server knows what packets the client has received and vise versa (ie a reliable and ordered message system). It is common to have a lot of NPCs of the same type in one area. If you store the values last received from this packet - at least the ones that would be of use like their name and apperance - you can use booleans like above to state "if true, use the last received value, else read the new value".
Value Ranges: Using a Truncated Binary Encoding algorithm, you can make use of those values between powers of 2. If you have 0 to 10, setting it on the range of 0 to 15 is still going to be a waste of those 5 sequences (11 to 15). They will never occur. If you define the min and max values on both the reading and writing (in opposed to the usual "how many bits to use"), you can slip some of those values in the 0 to 10 range into 3 bytes and the rest into 4 instead of 4 for them all.
vbGORE - open-source VB6 multiplayer ORPG engine