En .NET, estoy tratando de usar el método Encoding.UTF8.GetString
, que toma una matriz de bytes y la convierte en string
.Encoding.UTF8.GetString no tiene en cuenta el Preámbulo/BOM
Parece que este método ignora el BOM (Byte Order Mark), que podría formar parte de una representación binaria legítima de una cadena UTF8, y lo toma como un carácter.
Sé que puedo usar un TextReader
para digerir la lista de materiales según sea necesario, pero pensé que el método GetString debería ser una especie de macro que hace que nuestro código sea más corto.
¿Echo de menos algo? ¿Es esto tan intencionalmente?
Aquí hay un código de reproducción:
static void Main(string[] args)
{
string s1 = "abc";
byte[] abcWithBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(true)))
{
sw.Write(s1);
sw.Flush();
abcWithBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithBom)); // ef, bb, bf, 61, 62, 63
}
byte[] abcWithoutBom;
using (var ms = new MemoryStream())
using (var sw = new StreamWriter(ms, new UTF8Encoding(false)))
{
sw.Write(s1);
sw.Flush();
abcWithoutBom = ms.ToArray();
Console.WriteLine(FormatArray(abcWithoutBom)); // 61, 62, 63
}
var restore1 = Encoding.UTF8.GetString(abcWithoutBom);
Console.WriteLine(restore1.Length); // 3
Console.WriteLine(restore1); // abc
var restore2 = Encoding.UTF8.GetString(abcWithBom);
Console.WriteLine(restore2.Length); // 4 (!)
Console.WriteLine(restore2); // ?abc
}
private static string FormatArray(byte[] bytes1)
{
return string.Join(", ", from b in bytes1 select b.ToString("x"));
}
veo. ¡Gracias por la aclaración! –
@RonKlein Además, podría decir 'restore2 = restore2.TrimStart ('\ uFEFF')' para eliminar los principales caracteres de la BOM. También me he preguntado por qué '(nuevo UTF8Encoding (true)). GetBytes (" abc ")' y '(new UTF8Encoding (false)). GetBytes (" abc ")' produce el mismo resultado, pero como probablemente Sé que hasta ahora, 'GetBytes' no supone que estás en el comienzo de un archivo, por lo que nunca usa' GetPreamble'. Tienes que 'GetPreamble' explícitamente, o saltear el preámbulo explícitamente, si usas 'GetBytes' o 'GetString'. –