Well, obviously no characters, i.e. FileName.txt, will be the most portable option. Given the remaining options, I tend to go with underscores. They function visually as spaces and don't cause the problems that spaces do.
- periods: get confused with extensions
- minus signs: get confused, visually at least, on Unix-y systems with command-line options.
- spaces: Some programs, scripts, and the like get confused and try to break the filename apart at spaces.
- (others): Any character that ever requires escaping, i.e.
File\*Name.txt, would be a bad choice as well.
My exception to the rule: In my daily use, I tend to use spaces in filenames that I know I'll only ever be using through GUI file browsers and with word processors and the like. Every modern app and OS handles spaces correctly and they are the natural language way to break up words. As_opposed_to_writing_like_this_which_no_one_does.