c# - net - java acentos utf-8
Uso de.NET para convertir archivos de texto codificados ISO 8859-1 que contienen caracteres acentuados Latin-1 a UTF-8 (2)
Es necesario obtener el objeto de Encoding
adecuado. ASCII es como se llama: ASCII, lo que significa que solo admite caracteres ASCII de 7 bits. Si lo que quiere hacer es convertir archivos, es probable que esto sea más fácil que tratar directamente con matrices de bytes.
using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName,
Encoding.GetEncoding("iso-8859-1")))
{
using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
outFileName, Encoding.UTF8))
{
writer.Write(reader.ReadToEnd());
}
}
Sin embargo, si desea tener los arreglos de bytes usted mismo, es muy fácil hacerlo con Encoding.Convert
.
byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"),
Encoding.UTF8, data);
Sin embargo, es importante tener en cuenta que si desea seguir este camino, no debe usar un lector de cadenas basado en codificación como StreamReader
para su archivo IO. FileStream
sería más adecuado, ya que leerá los bytes reales de los archivos.
En el interés de explorar completamente el tema, algo como esto funcionaría:
using (System.IO.FileStream input = new System.IO.FileStream(fileName,
System.IO.FileMode.Open,
System.IO.FileAccess.Read))
{
byte[] buffer = new byte[input.Length];
int readLength = 0;
while (readLength < buffer.Length)
readLength += input.Read(buffer, readLength, buffer.Length - readLength);
byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"),
Encoding.UTF8, buffer);
using (System.IO.FileStream output = new System.IO.FileStream(outFileName,
System.IO.FileMode.Create,
System.IO.FileAccess.Write))
{
output.Write(converted, 0, converted.Length);
}
}
En este ejemplo, la variable del buffer
se llena con los datos reales en el archivo como un byte[]
, por lo que no se realiza ninguna conversión. Encoding.Convert
especifica una Encoding.Convert
origen y destino, luego almacena los bytes convertidos en la variable llamada ... converted
. Esto luego se escribe en el archivo de salida directamente.
Como dije, la primera opción que use StreamReader
y StreamWriter
será mucho más simple si esto es todo lo que está haciendo, pero el último ejemplo debería darle más pistas sobre lo que realmente está sucediendo.
Me están enviando archivos de texto guardados en formato ISO 88591-1 que contienen caracteres acentuados del rango Latin-1 (así como ASCII az normal, etc.). ¿Cómo convierto estos archivos a UTF-8 usando C # para que los caracteres acentuados de un solo byte en ISO 8859-1 se conviertan en caracteres UTF-8 válidos?
He intentado usar un StreamReader con ASCIIEncoding y luego convertir la cadena ASCII a UTF-8 mediante la utf8
instancias de codificación ascii
y codificación utf8
y luego usar Encoding.Convert(ascii, utf8, ascii.GetBytes( asciiString) )
- pero los caracteres acentuados se están representando como signos de interrogación.
¿Qué paso me estoy perdiendo?
Si los archivos son relativamente pequeños (por ejemplo, ~ 10 megabytes), solo necesitará dos líneas de código:
string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1"));
System.IO.File.WriteAllText(outPath, txt);