Sorry, I don't know about the square brackets. There are a handful of characters that choke the parser, but I haven't had trouble with any disappearing.
I want to invite you to look at another potential issue, though. The characters() method is not guaranteed to give you all the contents of a tag in one shot. You can imagine the parser buffering input somewhere under the covers - it might even be true. If the end of one buffer comes in the middle of a tag, it might call you with the characters it has so far, read up the next buffer and call you again with the rest of the characters in the tag. I learned this by being burned by a parser in another language that worked in 2048 byte chunks.
My solution has been to have the characters() method append what it gets to a member variable
string, and to use the string in the endElement method instead. Seems to work so long as you don't have nested tags in the middle of the text like a bold
word in the middle of an HTML paragraph.
Let me know what you learn on the square brackets!