【C#コードの小さな知識】蛇足を描いたコード接頭辞
1637 ワード
ファイルには異なる符号化があることはよく知られています.例えば、私たちがよく使う中国語の符号化はUTF 8、GK 2312などです.
Windowsオペレーティングシステムでは、新しいファイルには、最初の部分にいくつかの文字の接頭辞が追加され、符号化が識別されます.
たとえば、新しいテキストファイルを作成し、単語
奇妙なことに、 が追加するか否かを示す. とエラーが発生するか否かを示す.
このことから,符号化接頭辞を追加するかどうかは制御可能である.
これが先頭のコードの2つのファイルのサイズが異なる理由です.
Windowsオペレーティングシステムでは、新しいファイルには、最初の部分にいくつかの文字の接頭辞が追加され、符号化が識別されます.
たとえば、新しいテキストファイルを作成し、単語
Hello
に書き込み、UTF 8として保存します.Hello
は5バイトですが、テキストサイズは8バイトです.(win 7システムではやはりそうですが、win 10は符号化プレフィックスを外しているので、win 10下のファイルサイズは依然として5バイトです.マイクロソフト自身も変わっているようです.)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
のデフォルトコードはUTF 8で、すべてUTF 8でコードされていますが、どのようにファイルのサイズが違いますか?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つのファイルのサイズが異なる理由です.