RFC 3986 is intended for uri's on the internet, not for local file names (so at least the comment mentioning RFC 3986 is misleading)
The best list of reserved characters that I can find (did not search thoroughly) is at http://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words - at least the pipe is missing here.
It looks like some of the current list (like parentheses) are in fact valid in a file - but then again, when they are to be downloaded over the internet, they're accessible over - right - a URI that should comply to RFC 3986, as well as have a valid filename ;)

In conclusion, I would keep the above code, and add this below:

    /*
     * in addition to RFC 3986, make sure the local filename is valid
     * @see http://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words)
     */
    $reservedCharacters[] = '|';