web-dev-qa-db-fra.com

C # Convertir une chaîne de UTF-8 à ISO-8859-1 (Latin1) H

J'ai googlé sur ce sujet et j'ai examiné chaque réponse, mais je ne comprends toujours pas.

En gros, j'ai besoin de convertir la chaîne UTF-8 en ISO-8859-1 et je le fais en utilisant le code suivant:

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

Ma chaîne source est

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

Mais malheureusement, ma chaîne de résultat devient

msg = "�ä�ö�õ�ü

Qu'est-ce que je fais mal ici?

95
Daniil Harik

Utilisez Encoding.Convert pour ajuster le tableau d'octets avant de tenter de le décoder dans le codage de votre destination.

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

Je pense que votre problème est que vous supposez que les octets représentant la chaîne utf8 donneront la même chaîne, une fois interprétés (iso-8859-1). Et ce n'est tout simplement pas le cas. Je vous recommande de lire cet excellent article par Joel Spolsky.

23

Essaye ça:

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

Vous devez commencer par corriger le source de la chaîne.

Une chaîne dans .NET est en fait juste un tableau de points de code unicode 16 bits, de sorte qu'une chaîne ne fait l'objet d'aucun codage particulier.

C'est lorsque vous convertissez cette chaîne en un ensemble d'octets que le codage entre en jeu.

Dans tous les cas, la façon dont vous avez procédé, coder une chaîne dans un tableau d'octets avec un jeu de caractères, puis le décoder avec un autre, ne fonctionnera pas, comme vous le voyez.

Pouvez-vous nous en dire plus sur l'origine de cette chaîne d'origine et sur les raisons pour lesquelles vous pensez qu'elle a été mal encodée?

Semble peu de code étrange. Pour obtenir une chaîne à partir du flux d'octets Utf8, il suffit de:

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

Si vous avez besoin de sauvegarder le flux d'octets iso-8859-1 dans un endroit, utilisez simplement: une ligne de code supplémentaire pour la version précédente:

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

Je viens d'utiliser la solution de Nathan et cela fonctionne bien. J'avais besoin de convertir ISO-8859-1 en 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