テキストファイルの中身(UTF-8 or SJIS or EUC)の先頭の80文字をファイル名にして保存するプログラムをPHP5.2で作ろうとしています。

1) urlencodeみたいな感じでテキストからファイル名が許容できる形式に変更する関数を教えてください
2) 生成されたテキストファイルは、WindowsXP,Ubuntu,MacOSで見る可能性があるのですが、ファイル名のエンコードはどれが最適でしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/06/17 11:30:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:espresso3389 No.1

回答回数35ベストアンサー獲得回数6

ポイント35pt

まず、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のからみで、

:

が使えず、また、ファイル名が . から始まるファイルが事実上見えなくなるので、これも使わない方が良いでしょう。

上記内容を簡単にまとめると、

  • ファイル名は、Unicodeであることを前提とするのが良いと考えられる
  • \ / : * ? " < > | をファイル名に使えない文字とするのが良い
  • Mac OS X上での処理を考えると、ファイル名の先頭に . は使えないと考えた方が良い

となります。そのため、これらの文字のみを%XXの様な感じでエスケープするか、あるいは、単純に削除するのが良いと考えられます。

また、ファイルのエンコードについては、最近は、どのOSでもUTF-8のファイルであれば、普通に開くことが出来ます。ただし、文字コードの自動判別は難しいことがあるので、BOM付きのUTF-8がお勧めです。

結局、ご質問の内容に対する正確な返答にはなっていないと思いますが、ご参考程度にはなると思います。

http://example.com (ダミーです)

id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント35pt

ファイル名が許容できる形式に変更する関数

そんな物はない。

先の回答者も述べているように、OSやファイルシステムによって制限は様々だから

そのOSごとの対応ならともかく、共通で使えるような専用関数は無い。


生成されたテキストファイルは、WindowsXP,Ubuntu,MacOSで見る可能性がある

それぞれバージョンとファイルシステムぐらいは書かないと何とも言えません。


上記を踏まえた上で無難そうなのは、Base64 で変換し、変換後の文字列のうち、「/」を「-」に変換した物です。

Base64 - Wikipedia

これで有ればすべての文字は US-ASCII の範囲内で収まりますのでエンコーディングはほぼ関係ないですし、

OSごとの特殊文字もほとんど引っかかることはないでしょう。


ただし、今度はファイル名の文字列長制限に引っかかる恐れがありますが、80文字程度ならぎりぎり何とかなるでしょう。

(UTF-8 で日本語のみ80文字だとかなり厳しいですが)

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません