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 (ダミーです)
ファイル名が許容できる形式に変更する関数
そんな物はない。
先の回答者も述べているように、OSやファイルシステムによって制限は様々だから
そのOSごとの対応ならともかく、共通で使えるような専用関数は無い。
生成されたテキストファイルは、WindowsXP,Ubuntu,MacOSで見る可能性がある
それぞれバージョンとファイルシステムぐらいは書かないと何とも言えません。
上記を踏まえた上で無難そうなのは、Base64 で変換し、変換後の文字列のうち、「/」を「-」に変換した物です。
これで有ればすべての文字は US-ASCII の範囲内で収まりますのでエンコーディングはほぼ関係ないですし、
OSごとの特殊文字もほとんど引っかかることはないでしょう。
ただし、今度はファイル名の文字列長制限に引っかかる恐れがありますが、80文字程度ならぎりぎり何とかなるでしょう。
(UTF-8 で日本語のみ80文字だとかなり厳しいですが)
コメント(0件)