C # Converti una stringa da UTF-8 a ISO-8859-1 (Latin1) H

Ho cercato su questo argomento e ho esaminato ogni risposta, ma ancora non capisco.

Fondamentalmente ho bisogno di convertire la stringa UTF-8 in ISO-8859-1 e lo faccio usando il seguente codice:

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

La mia stringa sorgente è

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

Ma sfortunatamente il mio risultato diventa una stringa

 msg = "�ä�ö�õ�ü 

Cosa sto facendo di sbagliato qui?

Utilizzare Encoding.Convert per regolare l’array di byte prima di tentare di decodificarlo nella codifica di destinazione.

 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); 

Penso che il tuo problema è che tu presumi che i byte che rappresentano la stringa utf8 risulteranno nella stessa stringa quando interpretati come qualcos’altro (iso-8859-1). E questo semplicemente non è il caso. Vi consiglio di leggere questo eccellente articolo di Joel Spolsky.

Prova questo:

 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); 

È necessario correggere l’origine della stringa in primo luogo.

Una stringa in .NET è in realtà solo una matrice di punti di codice unicode a 16 bit, caratteri, quindi una stringa non è in alcuna codifica particolare.

È quando prendi quella stringa e la converti in una serie di byte che la codifica entra in gioco.

In ogni caso, come hai fatto tu, hai codificato una stringa in un array di byte con un set di caratteri e poi decodificandolo con un altro, non funzionerà, come vedi.

Puoi dirci di più su da dove proviene quella stringa originale e perché pensi che sia stata codificata in modo errato?

Sembra un po ‘strano codice. Per ottenere una stringa dal stream di byte Utf8 tutto ciò che devi fare è:

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

Se è necessario salvare iso-8859-1 stream di byte da qualche parte, utilizzare semplicemente: riga di codice aggiuntiva per i precedenti:

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

Ho appena usato la soluzione di Nathan e funziona perfettamente. Avevo bisogno di convertire ISO-8859-1 in 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); 

Ecco un esempio per 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);}