¿Cómo GetBytes () en C # con la encoding UTF8 con BOM?

Tengo un problema con la encoding UTF8 en mi aplicación asp.net mvc 2 en C #. Estoy intentando que el usuario descargue un archivo de texto simple de una cadena. Estoy tratando de obtener una matriz de bytes con la siguiente línea:

var x = Encoding.UTF8.GetBytes(csvString);

pero cuando lo devuelvo para su descarga usando:

return File(x, ..., ...);

Obtengo un archivo sin BOM, por lo que no aparece correctamente los caracteres croatas. Esto se debe a que mi matriz de bytes no incluye la lista de materiales después de la encoding. Estoy interesado en insertar esos bytes manualmente y luego aparece correctamente, pero esa no es la mejor manera de hacerlo.

También intenté crear una instancia de clase UTF8Encoding y pasar un valor booleano (verdadero) a su constructor para incluir BOM, pero tampoco funciona.

Alguien tiene una solución? ¡Gracias!

Pruebe de esta manera:

 public ActionResult Download() { var data = Encoding.UTF8.GetBytes("some data"); var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray(); return File(result, "application/csv", "foo.csv"); } 

La razón es que el constructor UTF8Encoding que toma un parámetro booleano no hace lo que cabría esperar:

 byte[] bytes = new UTF8Encoding(true).GetBytes("a"); 

La matriz resultante contendría un solo byte con el valor de 97. No hay lista de materiales porque UTF8 no requiere una lista de materiales.

Creé una extensión simple para convertir cualquier cadena en cualquier encoding a su representación de matriz de bytes cuando se escribe en un archivo o secuencia:

 public static class StreamExtensions { public static byte[] ToBytes(this string value, Encoding encoding) { using (var stream = new MemoryStream()) using (var sw = new StreamWriter(stream, encoding)) { sw.Write(value); sw.Flush(); return stream.ToArray(); } } } 

Uso:

 stringValue.ToBytes(Encoding.UTF8) 

Esto funcionará también para otras codificaciones como UTF-16 que requiere la BOM.

UTF-8 no requiere una lista de materiales, porque es una secuencia de palabras de 1 byte. UTF-8 = UTF-8BE = UTF-8LE.

Por el contrario, UTF-16 requiere una lista de materiales al comienzo de la secuencia para identificar si el rest de la secuencia es UTF-16BE o UTF-16LE, porque UTF-16 es una secuencia de palabras de 2 bytes y la lista de materiales identifica si el los bytes en las palabras son BE o LE.

El problema no está en la clase Encoding.UTF8 . El problema radica en cualquier progtwig que esté utilizando para ver los archivos.

Recuerde que las cadenas .NET son todas unicode mientras permanecen en la memoria, por lo que si puede ver su csvString correctamente con el depurador, el problema es escribir el archivo.

En mi opinión, debería devolver un FileResult con la misma encoding que los archivos. Intente configurar la encoding del archivo que regresa,

Intereting Posts