理由の多くは歴史的なものです。それは彼らが今日意味をなさないことを意味しません。
移植性の問題
ファイルに名前を付けるとき、他の(ファイル)システムがそのファイル名をどのように扱うかを考慮する必要があるかもしれません。ファイル名の文字はシステムにとっては問題ないかもしれませんが、別のシステムでは問題になる可能性があります。
したがって、古いシステムからファイルに簡単にアクセスできる可能性がわずかにある限り、安全な文字のみを選択します。これには、保持していた古いリカバリシステムを起動したり、最近のWindowsバージョンがまだMS-DOSに基づいているのではないかという恐れが含まれる場合があります。
長さ
ファイルシステムは、ファイルの長さを制限する場合があります。これは、MS-DOSが8.3ファイル名に制限されていた時代にはさらに深刻でした。そのため、スペースを省くことで、より意味のある文字を名前に含めることができました。
他のいくつかのファイルシステムも、ファイル名の長さの厳密な制限を定義しています。ウィキペディアには、詳細を知りたい人のためのファイルシステムの比較に関する記事の表があります。
予約キャラクター
MS-DOSは、スペース文字を予約文字としても定義しました。これは、スペース文字がFATのパディングに使用されたという事実によるものです。さらに、MS-DOSはシェル内のエスケープシステムを提供しませんでした。
コマンドラインの解釈
私が知っているほとんどのコマンドラインは、パラメータ区切り文字としてスペース文字を使用しています。ファイル名を適切にエスケープしないと、ファイル名の一部が呼び出したいアプリケーションのパラメーターとして解釈される可能性があるため、悲惨な結果を招く可能性があります。
の違いを考慮してください
rm foo bar
そして
rm "foo bar"
上にリンクされたWikiPediaの記事は、コマンドを適切にエスケープするために欠落することによって導入された曖昧さを指摘しています:
あいまいさは、最初にファイル名とディレクトリ名に埋め込まれたスペースを禁止することで防止できます(たとえば、アンダースコア「_」で置き換えることにより)、またはコマンドラインインタープリターとこれらのパラメーターを取るプログラムでサポートされている場合引数。引用符の間にスペースを埋め込んだり、スペースの前にエスケープ文字(通常はバックスラッシュ( '\'))を使用して名前を囲みます。例えば
Long path/Long program name Parameter one Parameter two ...
あいまいです(「プログラム名」はプログラム名の一部ですか、それとも2つのパラメーターですか?)。しかしながら
Long_path/Long_program_name Parameter_one Parameter_two ...,
LongPath/LongProgramName ParameterOne ParameterTwo ...,
"Long path/Long program name" "Parameter one" "Parameter two" ...
およびLong \ path / Long \ program \ name Parameter \ one Parameter \ two ...
あいまいではありません。
Uniform Resource Locators(URL)
URLを使用してファイルの場所を記述しようとすると、スペースをエスケープする必要があります。
文字は、いくつかの理由で安全でない場合があります。スペース文字は安全ではありません。なぜなら、URLが転写またはタイプセットされるか、ワードプロセッシングプログラムの処理が行われると、重要なスペースが消えて、重要でないスペースが導入される可能性があるためです。
出典:RFC1738
したがって、%20
代わりにスペースを置き換える必要があります。これにより、URLのファイル名の部分が読みにくくなるため、そもそもURLを避けるようになります。