it-swarm.dev

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?

94
Daniil Harik

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);
153
Nathan Baulch

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 por Joel Spolsky.

23
Klaus Byskov Pedersen

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

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?

8
Lasse Vågsæther Karlsen

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

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

Se você precisa salvar o fluxo 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);
6
Sander A
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);
0
Tomáš Opis

Apenas usei 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);
0
Nicolai Nita