たとえば、一般的に使用される中国語のエンコーディングは、UTF8、GK2312などです。
Windowsオペレーティングシステムでは、新しく作成されたファイルの先頭に、エンコードを識別するためのいくつかの文字がプレフィックスとして追加されます。
たとえば、新しいテキストファイルを作成し、wordsを記述してHello
、UTF8として保存します。Hello
5バイト必要ですが、テキストサイズは8バイトです。(これはwin7システムでは依然として当てはまります。win10からエンコーディングプレフィックスが削除されたため、win10でのファイルサイズは5バイトのままです。Microsoft自体が変更されたようです。)
私たちは、使用StreamWriter
ファイルを生成します。
using (StreamWriter sw = new StreamWriter("a.txt"))
{
sw.Write("Hello"); // 5 字节
}
using (StreamWriter sw = new StreamWriter("b.txt", false, Encoding.UTF8))
{
sw.Write("Hello"); // 8 字节
}
変なことが発生しました。StreamWriter
デフォルトのエンコードはUTF8で、UTF8エンコードです。ファイルサイズはどのように違うのですか?
UTF8Encoding
2つのプライベート属性があります。emitUTF8Identifier
およびはisThrowException
、初期化中にコンストラクターによって渡されます。
emitUTF8Identifier
エンコーディングプレフィックスを追加するかどうかisThrowException
エンコーディングエラーが発生したときにエラーが報告されるかどうかを示します
これは、コーディングプレフィックスを追加するかどうかを制御できることを示しています。
Encoding
されているUTF8
コードプレフィックスを追加し、次のように定義されました。
public static Encoding UTF8 {
get {
if (utf8Encoding == null) utf8Encoding = new UTF8Encoding(true);
return utf8Encoding;
}
}
StreamWriter
で使用されるデフォルトのエンコーディングemitUTF8Identifier=false
:
internal static Encoding UTF8NoBOM {
get {
if (_UTF8NoBOM == null) {
UTF8Encoding noBOM = new UTF8Encoding(false, true);
_UTF8NoBOM = noBOM;
}
return _UTF8NoBOM;
}
}
これが、コードの最初の2つのファイルが同じサイズではない理由です。