【C#コードの小さな知識】蛇足を描いたコード接頭辞

1637 ワード

ファイルには異なる符号化があることはよく知られています.例えば、私たちがよく使う中国語の符号化はUTF 8、GK 2312などです.
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つのプライベート属性があります.emitUTF8IdentifierisThrowExceptionで、初期化時に構造関数によって入力されます.
  • emitUTF8Identifierは、符号化プレフィックス
  • が追加するか否かを示す.
  • isThrowExceptionは、符号化エラーが発生したときに
  • とエラーが発生するか否かを示す.
    このことから,符号化接頭辞を追加するかどうかは制御可能である.EncodingUTF8は、符号化プレフィックスを追加するために以下のように定義される.
    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つのファイルのサイズが異なる理由です.