There are several classes of characters to be avoided, each of the for different reasons.
Characters not on the keyboard should be avoided, because they are hard to type (usually you need to find the character in the character map or some sample text, copy it and paste into your text). The sets of characters available are different for different keybord layouts, which makes this rule especially hard to follow.
Examples:
~ | {} [] <> ` # ^ & @ \
Characters treated specially by editing software are often transformed in "smart" ways into other characters, or even whole parts of text are changed.
Examples:
Invisible characters are obviously to be avoided in ReadableMarkup. They can be used if their presence is obvious (e.g. indentation), but it should never be required to count them, as this makes them InvisibleMarkup.
Examples:
Characters easy to confuse with other characters. Should be avoided especially in context where both characters fit.
Examples:
"'" and "`", ":" and ";", "," and ".", "!" and "|"
There are several techniques of avoiding the special characters: