Why would we need any of the characters other than a-z A-Z .-?!() 0-9? We don't ever need them. Remove the other charaters immediately. Hello? Welcome to dumb ideas. Actually we do need them! The more the characters, the better.
Do you know what % is? I think you don't so I'll tell you, it's the percent sign. There is no reason not to add %. True, having no % symbol will cause pain only to new players, because experienced ones have learned to write "percent" instead. We don't need % to save the world, but hey, why not ease the handwork?
As for noobs who don't understand professional server code:
The server already parses and checks every character of sent strings. If it didn't, and accepted any message, then you just told me the newest, best and most powerful hack to crash ALL servers on the internet in just 1 minute. WOW!
tehOen read my post again and again, until it rings a bell, that what I posted is new and hasn't been discussed. Yes, indeed, passing "%s" to Com_Printf without a second parameter does do a crash when compiled with some compilers, but that hasn't happaned in years, because of the professional server code. When a client sends a chat message, like "write this %s", the client first parses the message and changes every single character % to a dot. So in the packet, it is sent as "write this .s". OK, there are hacked clients, so the server never uses unchecked messages, and also checks for every single % symbol. If you know basic C output, then you must know that the printf escape sequence %% prints a single % symbol with NO problem. Therefore it is safe to accept messages with %%.
For example: "kick %HAX% (50% needed)" sent by the (hacked) client will auto change to "kick .HAX. (50. needed)"
And my recommendation is that sending "kick %HAX% (50%% needed)" will change to "kick .HAX. (50%% needed)", and will not do anything to %%, because it safely prints as "kick .HAX. (50% needed)"