2008-11-16 4 views
4

Voici ce que j'ai obtenu jusqu'ici (ça ne marche pas). À ce stade, je pensais que ma cible était codée Ansi, mais je ne veux vraiment pas avoir à le savoir à ce stade. Mon navigateur semble être capable de déterminer quel encodage utiliser, comment puis-je?En C#, comment enregistrer une page Web dans un fichier sans détruire l'encodage?

static void GetUrl(Uri uri, string localFileName) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
    HttpWebResponse response; 

    response = (HttpWebResponse)request.GetResponse(); 

    // Save the stream to file 
    Stream responseStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(responseStream, Encoding.Default); 
    Stream fileStream = File.OpenWrite(localFileName); 
    using (StreamWriter sw = new StreamWriter(fileStream, Encoding.Default)) 
    { 
     sw.Write(reader.ReadToEnd()); 
     sw.Flush(); 
     sw.Close(); 
    } 
} 

Après des réponses (actuellement uniquement testé sur un UTF-8 site):

static void GetUrl(Uri uri, string localFileName) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    try 
    { 
     // Hope GetEncoding() knows how to parse the CharacterSet 
     Encoding encoding = Encoding.GetEncoding(response.CharacterSet); 
     StreamReader reader = new StreamReader(response.GetResponseStream(), encoding); 
     using (StreamWriter sw = new StreamWriter(localFileName, false, encoding)) 
     { 
      sw.Write(reader.ReadToEnd()); 
      sw.Flush(); 
      sw.Close(); 
     } 
    } 
    finally 
    { 
     response.Close(); 
    } 
} 
+0

Votre modification signifie-t-elle que vous le faites comme je l'ai suggéré? Si c'est le cas, vous devez déplacer la coche "Accepte la réponse". – Tomalak

+0

En fait, j'y ai pensé, mais je ne connais pas le protocole ici. Comme Lubos a suggéré de vérifier le charset dans la partie du type de contenu de l'en-tête. Lubos a des informations supplémentaires, mais vous suggérez de convertir utf-8 est également très utile. J'aimerais pouvoir fusionner les réponses. – CrashCodes

+0

La réponse de Lubos m'a conduit à Encoding.GetEncoding (response.CharacterSet) avant même que je lise votre message; mais votre message avait en fait le code C#. J'ai augmenté les deux, je lui ai laissé la réponse pour être le premier à me conduire à la réponse, et j'ai posté le code révisé pour montrer du respect pour votre poste et futurs lecteurs. – CrashCodes

Répondre

3

Il existe trois façons comment les navigateurs web tentent de détecter le codage de caractères.

Rechercher (si elle est HTML):

<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 

ou (XHTML)

<?xml version="1.0" encoding="ISO-8859-1"?> 

ou parfois il est même précisé l'en-tête http

Content-Type: text/html; charset=ISO-8859-1 
+0

J'utilise les informations d'en-tête pour la situation immédiate. Encoding.GetEncoding (response.CharacterSet); Cela semble faire l'affaire pour le moment. – CrashCodes

2

Vous devriez regarder pour l'encodage, le serveur envoie la réponse. Encoding.Default ne coupe pas la moutarde ici. :-)

Stream responseStream = response.GetResponseStream(); 
Encoding enc = Encoding.GetEncoding(response.CharacterSet); 
StreamReader reader = new StreamReader(responseStream, enc); 
Stream fileStream = File.OpenWrite(localFileName); 
using (StreamWriter sw = new StreamWriter(fileStream, enc)) 
{ /* ... */ } 

Pour être sûr, vous pouvez convertir tout en UTF-8 et stocker votre fichier en UTF-8 toujours. De cette façon, vous n'êtes jamais obligé de deviner l'encodage lors de la lecture du fichier.

Questions connexes