オペレーティングシステムに応じて、ファイル名に使用できる文字のリストはどこにありますか? (たとえば、Linuxでは、文字:
はファイル名に使用できますが、Windowsでは使用できません)
Wikipedia Filename ページから始める必要があります。適切なサイズのテーブル( ファイル名の制限の比較 )があり、非常に多くのファイルシステムの予約文字がリストされています。
また、MS-DOSでのCON
などの予約ファイル名を含む、各ファイルシステムに関するother情報が多数あります。インクルードファイルをconst.h
からcon.h
に短縮し、コンパイラがハングした理由を解明するのに30分を費やしたときに一度噛まれたことが理由です。
デバイスのDOSignored拡張機能を有効にして、con.h
がcon
(入力コンソール(つまり、もちろん、コンパイラは、ヘッダーファイルを続行する前にと入力するのを待っていました)。
それでは、 ファイルシステムの比較 を見てください。メインプレイヤーのファイルシステムのみに関心がある場合:
NUL
、\
、/
、:
、*
、"
、<
、>
、|
を除くすべてのUnicode:
または/
を除く有効なUnicodeNUL
または/
を除く任意のバイトしたがって、NUL
、\
、/
、:
、*
、"
、<
、>
、|
を除くすべてのバイトは、ファイル/フォルダーに.
または..
を呼び出せず、制御文字はありません(もちろん)。
Mac OS X(現在はMacOSと呼ばれる)についてより正確に言うと、Finderの/
は、Unixファイルシステムの:
に解釈されます。
これは、AppleがClassic Mac OSから移動したときの後方互換性のために行われました。
Finderでファイル名に/
を使用し、:
で表示されるターミナルで同じファイルを見るのは合法です。
また、それは他の方法でも動作します:ターミナルでファイル名に/
を使用することはできませんが、:
は問題なく、/
として表示されますファインダ。
一部のアプリケーションは、混乱を避けるため、または以前のClassic Mac OSからロジックを保持するため、またはプラットフォーム間の名前の互換性のために、両方の文字をより制限して禁止する場合があります。
「英語ロケール」ファイル名の場合、これはうまく機能します。アップロードしたファイル名をサニタイズするためにこれを使用しています。ファイル名はディスク上の何かにリンクされることを意図したものではありません。ファイルがダウンロードされているときのためであり、パスのチェックはありません。
$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);
基本的に、Windowsおよびその他のOSのすべての非印刷文字および予約文字を取り除きます。あなたはできる 簡単に 他のロケールと機能をサポートするためにパターンを拡張します。