J'ai cherché sur Google ce sujet et j'ai examiné toutes les réponses, mais je ne comprends toujours pas.
Fondamentalement, je dois 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 de mal ici?
Encoding.Unicode
et dans l'API Win32. Unicode est un jeu de caractères, pas un encodage. UTF-16 est l'un des nombreux encodages pour Unicode.)Message
été décodé à partir de l'UTF-8. En supposant que cette partie fonctionne 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)
Réponses:
Utilisez Encoding.Convert pour ajuster le tableau d'octets avant d'essayer de le décoder dans votre encodage de destination.
la source
Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))
Je pense que votre problème est que vous supposez que les octets qui représentent la chaîne utf8 donneront la même chaîne lorsqu'ils seront interprétés comme autre chose (iso-8859-1). Et ce n'est tout simplement pas le cas. Je vous recommande de lire cet excellent article de Joel spolsky.
la source
Essaye ça:
la source
Vous devez d'abord corriger la source de la chaîne.
Une chaîne dans .NET est en fait juste un tableau de points de code Unicode 16 bits, de caractères, donc une chaîne n'est pas dans un codage particulier.
C'est lorsque vous prenez cette chaîne et la convertissez en un ensemble d'octets que l'encodage entre en jeu.
Dans tous les cas, la façon dont vous l'avez fait, encodé une chaîne dans un tableau d'octets avec un jeu de caractères, puis le décodage 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 pourquoi vous pensez qu'elle a été mal encodée?
la source
Cela semble un peu étrange. Pour obtenir une chaîne à partir du flux d'octets Utf8, tout ce que vous devez faire est:
Si vous devez enregistrer le flux d'octets iso-8859-1 quelque part, utilisez simplement: ligne de code supplémentaire pour la précédente:
la source
Je viens d'utiliser la solution de Nathan et cela fonctionne très bien. J'avais besoin de convertir ISO-8859-1 en Unicode:
la source
la source
Voici un exemple pour ISO-8859-9;
la source