Come faccio a ignorare il marcatore Ordine byte UTF-8 nei confronti tra stringhe?

Sto riscontrando un problema nel confrontare le stringhe in un test unitario in C # 4.0 utilizzando Visual Studio 2010. Questo stesso caso di test funziona correttamente in Visual Studio 2008 (con C # 3.5).

Ecco lo snippet di codice pertinente:

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

Durante il debug di questo test, la stringa di data viene visualizzata ad occhio nudo per contenere esattamente la stessa stringa del letterale. Quando ho chiamato data.ToCharArray() , ho notato che il primo byte dei data stringa è il valore 65279 che è il marcatore ordine byte UTF-8. Quello che non capisco è perché Encoding.UTF8.GetString() mantiene questo byte in giro.

Come ottengo Encoding.UTF8.GetString() per non inserire il Byte Order Marker nella stringa risultante?

Aggiornamento: il problema era che GetData() , che legge un file dal disco, legge i dati dal file usando FileStream.readbytes() . Ho corretto questo usando un StreamReader e convertendo la stringa in byte usando Encoding.UTF8.GetBytes() , che è quello che avrebbe dovuto fare in primo luogo! Grazie per tutto l’aiuto.

Beh, suppongo sia perché i dati binari non elaborati includono il BOM. È sempre ansible rimuovere il BOM da soli dopo la decodifica, se non lo si desidera, ma è necessario considerare se l’array di byte deve considerare il DB con cui iniziare.

EDIT: In alternativa, è ansible utilizzare uno StreamReader per eseguire la decodifica. Ecco un esempio, mostrando lo stesso array di byte convertito in due caratteri usando Encoding.GetString o un carattere tramite StreamReader :

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

C’è un modo leggermente più efficiente per farlo rispetto alla creazione di StreamReader e MemoryStream:

1) Se sai che c’è sempre una BOM

 string viaEncoding = Encoding.UTF8.GetString(withBom, 3, withBom.Length - 3); 

2) Se non lo sai, controlla:

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

Credo che il carattere extra venga rimosso se Trim () la stringa decodificata