2010-01-08 3 views
1

Quelqu'un peut-il expliquer la différence entre appeler GetPreamble() sur un encodage utf8 nouvellement instancié par opposition aux publics disponibles dans la classe Encoding?Le préambule est vide pour (new Utf8Encoding()) GetPreamble() - bizarre

byte[] p1 = Encoding.UTF8.GetPreamble(); 
byte[] p2 = new UTF8Encoding().GetPreamble(); 

p1 est normal 3 octets préambule utf-8, mais p2 finit par être vide, ce qui semble très mal.

+0

Encoding.GetEncoding ("utf-8"). GetPreamble() fonctionne correctement. –

+0

MarcosMeli a répondu à votre question, oui? Vous devriez accepter sa réponse. –

Répondre

8

La différence est que la propriété UTF8 de Enconding est créé de cette façon

new UTF8Encoding(true) 

cela indique que encoderShouldEmitUTF8Identifier = true si le préambule de 3 octets est là

et votre appel au constructeur par défaut

new UTF8Encoding() 

est équivalent à

new UTF8Encoding(false) 

Pour obtenir mêmes résultats:

byte[] p1 = Encoding.UTF8.GetPreamble(); 
byte[] p2 = new UTF8Encoding(true).GetPreamble(); 
+0

Cela a du sens, merci. –

+0

J'ai eu quelques problèmes avec cela il y a un certain temps, heureux que cela aide :) – MarcosMeli

+0

Notez également que certaines classes .NET, comme 'System.IO.StreamWriter', utilisent réellement' new UTF8Encoding (false, true) 'par défaut. C'est différent de la propriété 'Encoding.UTF8', comme il ressort de ce qui précède. –

2

Donc, mon code qui est tous savent préambules ressemble à ceci maintenant:

var preambles = new Dictionary<string, byte[]>(); 
foreach (var encodingInfo in Encoding.GetEncodings()) { 
    Encoding encoding = Encoding.GetEncoding(encodingInfo.Name); 
    var preamble = encoding.GetPreamble(); 
    if (preamble != null && preamble.Length > 0) 
     preambles.Add(encodingInfo.Name, preamble); 
} 

Turns là arent beaucoup d'entre eux

utf-16  [2] 255 254 
unicodeFFFE [2] 254 255 
utf-32  [4] 255 254 0 0 
utf-32BE [4] 0 0 254 255 
utf-8  [3] 239 187 191 

De cette façon, je peux écrire du code qui convertit en toute sécurité un tableau d'octets avec un préambule facultatif à une chaîne juste par suppl ying un encodeur par défaut pour ceux sans préambule. Yay

+0

Il est étrange qu'il existe apparemment une nomenclature pour UTF-7, mais le framework .net n'a aucun support pour cela du tout. – Nyerguds

Questions connexes