2016-03-27 118 views
3

私はしかし、非常に次の試験Geditの2.Linuxに保存されているテキストファイルの文字エンコーディングはどこですか?

試験1にまで追加しない何かがあると、私は文字列のみを含む新しいファイルを作成し、短い答えは「どこにも」あってはならない知っています"aàbï"では、 "名前を付けて保存"を選択し、文字エンコーディングを選択するセレクタがあります。だから私はそれを "Unicode(UTF-8)"として保存し、同じことを繰り返し、別のファイルに "ISO-8859-15"として保存します。最初のファイルのサイズは7バイトです(2バイトの文字2個、2バイトの文字2個、ファイルの最後にLFがあり、16進数のダンプが表示されます)。 2番目のファイルのサイズは5バイトです(ラテンエンコーディングの4バイト文字+ LF)。これは、エンコーディングがファイル内のどこにも格納されていないことを示しています。明らかに、私がGeditでファイルを開き、正しくデコードすると、内容を分析してデコードする方法を理解していなければなりません。

試験2。私は上記と同じですが、今度はファイルの内容がちょうど "abcd"、つまり4つのASCII文字です。保存された2つのファイルは同じサイズ(5バイト)で、の同じ16進ダンプです。 2つのファイルが同一で区別できないように思われるので、エンコーディングに関する情報はファイルには含まれていないようです。

しかし、テスト2の2つのファイルを再びGeditで開き、[名前を付けて保存]に移動すると、ファイルが保存されたエンコーディングが選択されます。 Geditは、あるファイルがUTF-8とISO-8859-15でエンコードされていることを何とか知ることができますが、両方とも同じバイト列になるascii文字しか含まれておらず、同じであるように見えます。それはどうですか?

ファイルシステムにはある種のメタデータがありますか?それとも、Geditは独自のキャッシュを持ち、同じコンピュータ上ですでに開いている(そして保存した)ファイルに対してユーザーの選択肢を記憶しているだけですか?

P.S.この質問は、非プログラミングテストケースを提出したとしても、プログラミングに関連するであることに注意してください。これは、特定のタイプのファイルがどのようにコード化され、どのように読み込み、解析、デコード、エンコード、プログラム。

+2

ことも有数欠場時々、揮発性と独自の情報になるので、おそらくそのエディタは、ファイル名でエンコーディングをキャッシュします。プレーンテキストファイルの文字エンコーディングはどこにも格納されていません。実際には、2番目の例の2つのファイルは実際には異なるエンコーディングを持っていません。それらは、7ビット文字の2つの4文字シーケンスを含むだけです。このような文字列はほとんどのエンコーディングで有効です。 – arkascha

+0

将来の読者のために、私はバイトオーダーマーカーu + FEFFで始まったUTF-8ファイルを見てきました。そして、その内容がUnicodeのバリエーションであるというヒントとして使用されたソフトウェア。 –

答えて

4

少なくともデフォルトではありません。文字列abcdは、両方のロケールのASCIIサブセットで同じようにエンコードされているため、実際にはabcdを含む2つのファイルがファイルシステムに格納される方法に違いはありません。

外部ファイルシステムは、ファイルエンコードメタデータをログに記録しません。限られた量のデータ(数キロバイトのオーダ)を拡張ファイルシステム上のファイルと共に記録することは可能ですが、geditはこれを文字エンコードを格納するために使用せず、代わりに特定のユーザのデータをキャッシュします。特定のファイルに対して選択されたエンコーディング。これは、別のユーザー(この実験ではrootとしてログインしたユーザー)としてログインし、同じファイルを開くことで実証できます。geditは、他のログイン時に保存したカスタムロケールではなく、デフォルトのシステムロケール。

+0

Re:「2番目のケースでは、実際には2つのファイルのエンコーディングに違いはありません」:はい、OPのポイントです。 (S)彼は故意に同じ内容の2つのファイルを作成した。 – ruakh

+1

@ruakhはわかりやすくするために編集されています。 –

0

ファイルのエンコーディングは、ファイルのの属性として格納されません。その代わりに、プログラムはファイルを調べて、どのエンコーディングが最も適しているかを確認する必要があります。ファイルが異なるためTest1をは、興味深いものです:

  • ファイルがUTF-8でエンコードされていることを想定して始まる、geditはUTF-8
  • としてそれを解読しようとしますISO-8859-15ファイルには、有効なUTF-8エンコーディングでないバイトが含まれているため、geditはISO-8859-xバリアントの1つとして扱います
  • ISO-8859-15はISO-8859-15とは異なります-1)には、サンプルの一部ではない同じデータ—の解釈があります。
  • 詳細情報が不足している場合は、geditの方がロケール設定とgeditの設定が反映されますが、基本的には推測に過ぎません。 Test2を

、両方のファイルは、ASCIIエンコーディング(UTF-8、ISO-8859-15の両方のサブセット)を使用するので、追加情報はありません:geditはもう一度場合、ロケールとその設定に依存しますUTF-8としてファイルを使用するかどうかを選択します。

さらに読書:

関連する問題