I think it's a Windows thing.
The only work around I can think of would be converting all the non alphanum characters into hex values and then vica versa when reading them.
e.g. Hello! -> Hello%21
Yes, I was thinking about doing exactly that, except just changing the brackets to (). This way they can be converted back without any confusion if they get reversed (eg, [Brackets] would be read the same as ]Brackets[)