Nous savons tous que les fichiers ont des encodages différents, par exemple, les encodages chinois couramment utilisés sont: UTF8, GK2312, etc.
Dans le système d'exploitation Windows, le fichier nouvellement créé sera préfixé de quelques caractères au début pour identifier l'encodage.
Par exemple, créez un nouveau fichier texte, écrivez des mots Hello
et enregistrez-le au format UTF8. Hello
Cela prend 5 octets, mais la taille du texte est de 8 octets. (C'est toujours le cas sous le système win7, le préfixe d'encodage a été supprimé de win10, donc la taille du fichier sous win10 est toujours de 5 octets. Il semble que Microsoft lui-même ait changé.)
Nous utilisons StreamWriter
pour générer le fichier.
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 字节
}
Quelque chose de bizarre s'est produit. StreamWriter
L'encodage par défaut est UTF8, qui est l'encodage UTF8. Comment la taille du fichier peut-elle être différente?
UTF8Encoding
Il existe deux attributs privés: emitUTF8Identifier
et isThrowException
transmis par le constructeur lors de l'initialisation.
emitUTF8Identifier
Indique s'il faut ajouter un préfixe d'encodageisThrowException
Indique si une erreur est signalée en cas d'erreur de codage
Cela montre que l'ajout d'un préfixe de codage peut être contrôlé.
Encoding
Sont UTF8
définis comme suit, ajouter le préfixe de code.
public static Encoding UTF8 {
get {
if (utf8Encoding == null) utf8Encoding = new UTF8Encoding(true);
return utf8Encoding;
}
}
Le StreamWriter
codage par défaut utilisé dans emitUTF8Identifier=false
:
internal static Encoding UTF8NoBOM {
get {
if (_UTF8NoBOM == null) {
UTF8Encoding noBOM = new UTF8Encoding(false, true);
_UTF8NoBOM = noBOM;
}
return _UTF8NoBOM;
}
}
C'est pourquoi les deux fichiers du code au début n'ont pas la même taille.