J'ai fait des recherches sur ce sujet et j'ai regardé toutes les réponses, mais je ne comprends toujours pas.
En fait, j'ai besoin de convertir une 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ésultats devient
msg = "Ã?äÃ?öÃ?õÃ?ü
Qu'est-ce que je fais de mal ici ?
5 votes
Toutes les chaînes de caractères dans .NET sont stockées en interne en utilisant des caractères unicode. Il n'existe aucune notion de chaîne de caractères "Windows-1252", "iso-8859-1", "utf-8", etc. Essayez-vous de supprimer tous les caractères de votre chaîne qui n'ont pas de représentation dans la page de code Windows-1252 ?
1 votes
@IanBoyd En fait, un Chaîne de caractères est une séquence comptée d'unités de code UTF-16. (Malheureusement, le terme " Unicode " a été mal utilisé en
Encoding.Unicode
et dans l'API Win32. Unicode est un jeu de caractères, pas un encodage. UTF-16 est l'un des nombreux codages pour Unicode).1 votes
Vous faites une action incorrecte : vous créez un tableau d'octets en encodage utf8, mais vous les lisez avec un décodeur iso. Si vous voulez faire une chaîne avec des symboles encodés, il suffit d'appeler string msg = iso.GetString(iso.GetBytes(Message)) ;
0 votes
Cela s'appelle Mojibake.
0 votes
Je suppose que ce que Daniil dit est que
Message
a été décodé à partir d'UTF-8. En supposant que cette partie a fonctionné correctement, la conversion en Latin-1 est aussi simple quebyte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)
. Ensuite, comme le dit StuS, vous pouvez reconvertir les octets Latin-1 en UTF-16 avecEncoding.GetEncoding("ISO-8859-1").GetString(bytes)