It's because the username is part of the URL (web address) when you go to your profile, e.g.
/ means a new folder so we can't use that in a username
+ is also a special character that replaces spaces, for example Mike's URL is
/pokebase/user/~Holy+Name so if we allowed + then Holy Name and Holy+Name would both exist.
Not 100% sure about @ but it's generally a special character in many things.