Comment ignorer le marqueur d’ordre d’octets UTF-8 dans les comparaisons de chaînes?

J’ai des difficultés à comparer des chaînes dans un test unitaire en C # 4.0 à l’aide de Visual Studio 2010. Ce même cas de test fonctionne correctement dans Visual Studio 2008 (avec C # 3.5).

Voici l’extrait de code pertinent:

byte[] rawData = GetData(); ssortingng data = Encoding.UTF8.GetSsortingng(rawData); Assert.AreEqual("Constant", data, false, CultureInfo.InvariantCulture); 

Lors du débogage de ce test, la chaîne de data apparaît à l’œil nu comme contenant exactement la même chaîne que le littéral. Lorsque j’ai appelé data.ToCharArray() , j’ai remarqué que le premier octet de la chaîne de data était la valeur 65279 qui était le marqueur d’ordre d’octets UTF-8. Ce que je ne comprends pas, c’est pourquoi Encoding.UTF8.GetSsortingng() conserve cet octet.

Comment faire pour que Encoding.UTF8.GetSsortingng() ne mette pas le marqueur d’ordre d’octet dans la chaîne résultante?

Mise à jour: le problème était que GetData() , qui lit un fichier à partir du disque, lit les données du fichier à l’aide de FileStream.readbytes() . J’ai corrigé cela en utilisant un StreamReader et en convertissant la chaîne en octets à l’aide de Encoding.UTF8.GetBytes() , ce qui aurait dû être fait en premier lieu! Merci pour votre aide.

Eh bien, je suppose que c’est parce que les données binarys brutes incluent la nomenclature. Vous pouvez toujours supprimer la nomenclature après le décodage, si vous ne le souhaitez pas, mais vous devez déterminer si le tableau d’octets doit prendre en compte la nomenclature.

EDIT: Vous pouvez également utiliser un StreamReader pour effectuer le décodage. Voici un exemple montrant le même tableau d’octets converti en deux caractères à l’aide de Encoding.GetSsortingng ou d’un caractère via un StreamReader :

 using System; using System.IO; using System.Text; class Test { static void Main() { byte[] withBom = { 0xef, 0xbb, 0xbf, 0x41 }; ssortingng viaEncoding = Encoding.UTF8.GetSsortingng(withBom); Console.WriteLine(viaEncoding.Length); ssortingng viaStreamReader; using (StreamReader reader = new StreamReader (new MemoryStream(withBom), Encoding.UTF8)) { viaStreamReader = reader.ReadToEnd(); } Console.WriteLine(viaStreamReader.Length); } } 

Il existe un moyen légèrement plus efficace de le faire que de créer StreamReader et MemoryStream:

1) Si vous savez qu’il y a toujours une nomenclature

 ssortingng viaEncoding = Encoding.UTF8.GetSsortingng(withBom, 3, withBom.Length - 3); 

2) Si vous ne savez pas, vérifiez:

 ssortingng viaEncoding; if (withBom.Length >= 3 && withBom[0] == 0xEF && withBom[1] == 0xBB && withBom[2] == 0xBF) viaEncoding = Encoding.UTF8.GetSsortingng(withBom, 3, withBom.Length - 3); else viaEncoding = Encoding.UTF8.GetSsortingng(withBom); 

Je crois que le caractère supplémentaire est supprimé si vous coupez la chaîne décodée ()