C # Converter cadeia de UTF-8 para ISO-8859-1 (Latin1) H

Eu pesquisei neste tópico e olhei todas as respostas, mas ainda não entendi.

Basicamente eu preciso converter uma string UTF-8 para ISO-8859-1 e faço isso usando o seguinte código:

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

Minha string de origem é

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

Mas infelizmente minha string de resultado se torna

 msg = "�ä�ö�õ�ü 

O que estou fazendo errado aqui?

Use Encoding.Convert para ajustar a matriz de bytes antes de tentar decodificá-la em sua codificação 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); 

Eu acho que o seu problema é que você assume que os bytes que representam a string utf8 resultarão na mesma string quando interpretados como algo diferente (iso-8859-1). E isso simplesmente não é o caso. Eu recomendo que você leia este excelente artigo de Joel Spolsky.

Tente isto:

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

Você precisa corrigir a fonte da string em primeiro lugar.

Uma string no .NET é na verdade apenas uma matriz de pontos de código unicode de 16 bits, caracteres, portanto, uma string não está em nenhuma codificação específica.

É quando você pega essa string e a converte em um conjunto de bytes que a codificação entra em jogo.

Em qualquer caso, a maneira como você fez isso, codificou uma string para uma matriz de bytes com um conjunto de caracteres e, em seguida, decodificá-la com outra, não funcionará, como você vê.

Você pode nos dizer mais sobre a origem dessa string original e por que você acha que ela foi codificada errada?

Parece um código pouco estranho. Para obter uma seqüência de caracteres do stream de bytes Utf8, tudo o que você precisa fazer é:

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

Se você precisa salvar o stream de bytes iso-8859-1 em algum lugar, basta usar: linha de código adicional para anterior:

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

Acabei de usar a solução do Nathan e funciona bem. Eu precisava converter ISO-8859-1 para 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); 

Aqui está uma amostra 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);}