パスセグメントで使用できる文字 [RFC2396]
pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | ","
及び、param との区切り ";"。 "/"、";"、"=" は予約されているためパスセグメント中で使うにはエスケープする必要がある。
ということでエスケープなしで使える文字は、
0-9a-zA-Z | "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" | ":" | "&" | "+" | "$" | ","
Windows では
\/:,;*?"<>|
はファイル名に使えないので、これを考慮すると
0-0a-zA-Z | "-" | "_" | "." | "!" | "~" | "'" | "(" | ")" | "&" | "+" | "$"
"&"、"+", "$" はパスセグメント中ではエスケープする必要はないが、reserved に含まれる文字なので使わない方が場合によっては無難。これも考慮すると、
0-0a-zA-Z | "-" | "_" | "." | "!" | "~" | "'" | "(" | ")"
という文字集合を使うというのも手。