Look it's pretty simple, every code point represents a semantic meaning, except for:
1. those characters who also encode the width of their visual image (U+FF00..FFEF)
2. the one that means 'unknown' (U+FFFD)
3. those characters that change their visual representation depending on their position in the word (U+FB50..U+FDFF,U+FE70..U+FEFF)
4. those that change the visual image of another code point (U+FE00..U+FE0F)
5. those characters that have a visual image as their semantic meaning (too many to list)
6. those that are designated to have no semantic meaning at all (U+FDD0..U+FDEF)
7. those that have a meaning only in pairs (U+D800..U+DFFF)
8. miscellaneous