C # Convierte cadenas de UTF-8 a ISO-8859-1 (Latin1) H

He buscado en Google este tema y he analizado todas las respuestas, pero todavía no lo entiendo.

Básicamente necesito convertir cadenas UTF-8 a ISO-8859-1 y lo hago usando el siguiente código:

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8; string msg = iso.GetString(utf8.GetBytes(Message)); 

Mi cadena fuente es

 Message = "ÄäÖöÕõÜü" 

Pero desafortunadamente mi cadena de resultados se convierte

 msg = "�ä�ö�õ�ü 

¿Qué estoy haciendo mal aquí?

Utilice Encoding.Convert para ajustar la matriz de bytes antes de intentar decodificarla en su encoding de destino.

 Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(Message); byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); string msg = iso.GetString(isoBytes); 

Creo que su problema es que supone que los bytes que representan la cadena utf8 producirán la misma cadena cuando se interpreten como algo diferente (iso-8859-1). Y eso simplemente no es el caso. Te recomiendo que leas este excelente artículo de Joel spolsky.

Prueba esto:

 Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8; byte[] utfBytes = utf8.GetBytes(Message); byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes); string msg = iso.GetString(isoBytes); 

Primero debe arreglar la fuente de la cadena.

Una cadena en .NET es en realidad una matriz de puntos de código Unicode de 16 bits, caracteres, por lo que una cadena no está en ninguna encoding en particular.

Es cuando toma esa cadena y la convierte en un conjunto de bytes que la encoding entra en juego.

En cualquier caso, la forma en que lo hiciste, codificó una cadena a una matriz de bytes con un juego de caracteres, y luego decodificando con otro, no funcionará, como puedes ver.

¿Puede decirnos más sobre de dónde proviene esa secuencia original y por qué cree que se ha codificado incorrectamente?

Parece un código extraño. Para obtener una cadena de transmisión de bytes Utf8, todo lo que necesita hacer es:

 string str = Encoding.UTF8.GetString(utf8ByteArray); 

Si necesita guardar el flujo de bytes iso-8859-1 en algún lugar, solo use: línea de código adicional para el anterior:

 byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str); 

Solo usé la solución de Nathan y funciona bien. Necesitaba convertir ISO-8859-1 a Unicode:

 string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length); byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent); byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes); return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length); 
 Encoding targetEncoding = Encoding.GetEncoding(1252); // Encode a string into an array of bytes. Byte[] encodedBytes = targetEncoding.GetBytes(utfString); // Show the encoded byte values. Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes)); // Decode the byte array back to a string. String decodedString = Encoding.Default.GetString(encodedBytes); 

Aquí hay una muestra para ISO-8859-9;

 protected void btnKaydet_Click(object sender, EventArgs e) { Response.Clear(); Response.Buffer = true; Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet"; Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc"); Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9"); Response.Charset = "ISO-8859-9"; EnableViewState = false; StringWriter writer = new StringWriter(); HtmlTextWriter html = new HtmlTextWriter(writer); form1.RenderControl(html); byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString()); MemoryStream memoryStream = new MemoryStream(bytesInStream); string msgBody = ""; string Email = "mail@xxxxxx.org"; SmtpClient client = new SmtpClient("mail.xxxxx.org"); MailMessage message = new MailMessage(Email, "mail@someone.com", "ONLINE APP FORM WITH WORD DOC", msgBody); Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet"); message.Attachments.Add(att); message.BodyEncoding = System.Text.Encoding.UTF8; message.IsBodyHtml = true; client.Send(message);}