3 votes

Comment convertir correctement iso-8859-1 en utf8 ?

Je dois écrire un flux de réponses dans un fichier. Le flux contient une page encodée (iso-8859-1).

Voici mon code :

...

using (TextWriter writer = new StreamWriter(tmpFilePath))
{
  using (TextReader reader = new StreamReader(answer, Encoding.GetEncoding("ISO-8859-1")))
  {

    string line = "";
    while ((line = reader.ReadLine()) != null) 
    {

      // try to decode
      string decoded_line = decode(line);

      writer.WriteLine(decoded_line);
    }

  }

}

...

string decode(string message) 
{
  string result = "";

  Encoding iso = Encoding.GetEncoding("iso-8859-1");
  Encoding utf8 = Encoding.UTF8;

  byte[] isoBytes = iso.GetBytes(message);
  byte[] utf8Bytes = Encoding.Convert(iso, utf8, isoBytes);

  result = utf8.GetString(utf8Bytes);

  return result;
}

Le problème est que decode() ne fonctionne pas

enter image description here

Comment convertir correctement iso-8859-1 en utf8 ?

MISE À JOUR

Je me fie à fiddler pour obtenir le type de contenu :

enter image description here

3voto

Henk Holterman Points 153608

Compte tenu de la situation, il devrait suffire de :

using (TextWriter writer = new StreamWriter(tmpFilePath, Ecoding.UTF8))
{
 using (TextReader reader = new StreamReader(answer, Encoding.GetEncoding("ISO-8859-1")))
 {
   while ((line = reader.ReadLine()) != null) 
   {
      writer.WriteLine(decoded_line);
   }
 }    
}

Si cela ne fonctionne pas, vérifiez vos données. À quoi ressemble la (première) ligne dans le débogueur ?

1voto

zmbq Points 18714

Vous décodez deux fois - vous avez déjà spécifié l'encodage lors de la création du StreamReader. La chaîne résultante devrait déjà être correctement décodée.

Cela n'explique pas pourquoi message ressemble à cela - elle devrait ressembler à une chaîne de caractères ordinaire. Êtes-vous sûr que le fichier que vous lisez contient ce que vous pensez qu'il contient ?

-1voto

David Burg Points 339

Vous pouvez voir un exemple de code de conversion .NET de n'importe quel encodage vers n'importe quel encodage fonctionnant tel quel avec Azure Function, mais qui pourrait être ré-hébergé partout où .NET peut fonctionner :

https://learn.microsoft.com/en-us/archive/blogs/david_burgs_blog/support-non-utf-payloads-in-logic-app-with-a-conversion-azure-function

Cet exemple protège le contenu de l'entrée et de la sortie en encodage base64 pour s'assurer que l'hypothèse unicode de .NET pour le type de chaîne n'est pas un obstacle.

 var outputBytes = Encoding.Convert(srcEncoding: inputEncoding, dstEncoding: encodingOutput, bytes: Convert.FromBase64String(input));
...
text = Convert.ToBase64String(outputBytes)

Les tableaux d'octets peuvent tout aussi bien être lus et écrits directement dans un fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X