visual utf8 net getbytes change asp.net-mvc encoding utf-8 byte-order-mark

asp.net-mvc - net - utf8 encoding c#



¿Cómo GetBytes() en C#con codificación UTF8 con BOM? (4)

Estoy teniendo un problema con la codificación UTF8 en mi aplicación asp.net mvc 2 en C #. Estoy intentando que el usuario descargue un archivo de texto simple desde 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 descargar usando:

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

Obtengo un archivo que no tiene BOM, por lo que no se muestran correctamente los caracteres croatas. Esto se debe a que mi matriz de bytes no incluye BOM después de la codificación. Trate de insertar esos bytes manualmente y luego se muestra correctamente, pero esa no es la mejor manera de hacerlo.

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

¿Alguien tiene una solución? ¡Gracias!


Creé una extensión simple para convertir cualquier cadena en cualquier codificación 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 lista de materiales.


Prueba 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.


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 codificación que los archivos. Intente configurar la codificación de archivo de retorno,


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

En contraste, UTF-16 requiere una lista de materiales al comienzo del flujo para identificar si el resto del flujo 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 programa que esté utilizando para ver los archivos.