1) urlencodeみたいな感じでテキストからファイル名が許容できる形式に変更する関数を教えてください
2) 生成されたテキストファイルは、WindowsXP,Ubuntu,MacOSで見る可能性があるのですが、ファイル名のエンコードはどれが最適でしょうか?
まず、urlencodeの様な都合の良い関数はどこにもないと思います。理由としては、基本的に、UNIX系のプラットフォームでは、ファイル名に関して、あまり、厳格な決まりがなく、/ \0が使えないといった程度の決まりしかないからです。
とはいえ、最近のLinuxならば、文字コードは、概ね、UTF-8に統一されつつあり、お手元のUbuntuもUTF-8であると思われます。逆にこの前提が崩れると、たとえば、EUC-JPの場合には、最初に文字コードをその範囲に絞り込む処理(簡単に言えば、日本語以外を除去)が必要になるでしょう。
一方で、Windows XP、Mac OS Xに関しては、確実にファイル名の文字コードがUTF-16/UTF-8になっているので、いわゆるUnicodeの範疇の文字が使えます。Windowsでは、
\ / : * ? " < > |
がファイル名で利用できません。また、Mac OS Xでは、基本的には、UNIXに準じるので、/ だけが使えない文字なのですが、Finderのからみで、
:
が使えず、また、ファイル名が . から始まるファイルが事実上見えなくなるので、これも使わない方が良いでしょう。
上記内容を簡単にまとめると、
となります。そのため、これらの文字のみを%XXの様な感じでエスケープするか、あるいは、単純に削除するのが良いと考えられます。
また、ファイルのエンコードについては、最近は、どのOSでもUTF-8のファイルであれば、普通に開くことが出来ます。ただし、文字コードの自動判別は難しいことがあるので、BOM付きのUTF-8がお勧めです。
結局、ご質問の内容に対する正確な返答にはなっていないと思いますが、ご参考程度にはなると思います。
http://example.com (ダミーです)