Avatar billede kongen72 Nybegynder
21. november 2011 - 18:51 Der er 6 kommentarer

Charset fejl... men hvorfor ?

Hej eksperter

Har lavet en webcrawler, som crawler dansk data på danske sider.
På nogen af hjemmesiderne crawler den data ned og ændre specialtegn (æ, ø, å) til spørgsmålstegn istedet for. Ved simpelthen ikke hvorfor det sker..

på de hjemmesider hvor teksten kommer ned i db fejlfrit er det et charset=UTF-8, som bliver brugt.

og når den laver spørgsmålstegn i stedet for æ,ø,å. så er der brugt et charset=iso-8859-1.

Er der et klogt hovede derude, som ved hvordan det kan være at den laver specialtegn til spørgsmålstegn?

Tak på forhånd.
Avatar billede arne_v Ekspert
21. november 2011 - 19:04 #1
Du laeser vel data forkert.

Et mere detaljeret svar kraever at vi ser noget kode.
Avatar billede kongen72 Nybegynder
21. november 2011 - 19:38 #2
Kan jeg evt. kontakte dig via mail, så kan du lige hurtigt skimte hele dokumentet?
Avatar billede kongen72 Nybegynder
21. november 2011 - 19:56 #3
private string GetPageRequest(string requestURL, out string msgText)
        {
            string pageHtml = null;
            msgText = string.Empty;
            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL);
                request.Method = "GET";
                request.ContentType = "application/x-www-form-urlencoded; charset=iso-8859-1";
                request.AllowAutoRedirect = true;
                request.CookieContainer = new CookieContainer();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Response.Charset = "iso-8859-1";
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                    pageHtml = sr.ReadToEnd();
            }
            catch (TimeoutException ex)
            {
                msgText = ex.Message;
                throw ex;
            }
            catch (Exception ex)
            {
                msgText = ex.Message;
                throw ex;
            }
            return pageHtml;
        }
Avatar billede arne_v Ekspert
21. november 2011 - 20:26 #4
Hm.

Der er slet ikke noget kode som checker charset i respons??
Avatar billede arne_v Ekspert
22. november 2011 - 02:10 #5
Jeg lavede engang dette her stykke kode til at illustrere:

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace E
{
    public class HttpDownloadCharset
    {
        private static Regex encpat = new Regex("charset=([A-Za-z0-9-]+)", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        private static string ParseContentType(string contenttype)
        {
            Match m = encpat.Match(contenttype);
            if(m.Success)
            {
                return m.Groups[1].Value;
            }
            else
            {
                return "ISO-8859-1";
            }
        }
        private static Regex metaencpat = new Regex("<META\\s+HTTP-EQUIV\\s*=\\s*[\"']Content-Type[\"']\\s+CONTENT\\s*=\\s*[\"']([^\"']*)[\"']>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
        private static string ParseMetaContentType(String html, String defenc)
        {
            Match m = metaencpat.Match(html);
            if(m.Success)
            {
                return ParseContentType(m.Groups[1].Value);
            } else {
                return defenc;
            }
        }
        private const int DEFAULT_BUFSIZ = 1000000;
        public static string Download(string urlstr)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlstr);
            using(HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
            {
                if (resp.StatusCode == HttpStatusCode.OK)
                {
                    string enc = ParseContentType(resp.ContentType);
                    int bufsiz = (int)resp.ContentLength;
                    if(bufsiz < 0) {
                        bufsiz = DEFAULT_BUFSIZ;
                    }
                    byte[] buf = new byte[bufsiz];
                    Stream stm = resp.GetResponseStream();
                    int ix = 0;
                    int n;
                    while((n = stm.Read(buf, ix, buf.Length - ix)) > 0) {
                        ix += n;
                    }
                    stm.Close();
                    string temp = Encoding.ASCII.GetString(buf);
                    enc = ParseMetaContentType(temp, enc);
                    return Encoding.GetEncoding(enc).GetString(buf);
                }
                else
                {
                    throw new ArgumentException("URL " + urlstr + " returned " + resp.StatusDescription);
                }
            }
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(HttpDownloadCharset.Download("http://arne:81/~arne/f1.html"));
            Console.WriteLine(HttpDownloadCharset.Download("http://arne:81/~arne/f2.html"));
            Console.WriteLine(HttpDownloadCharset.Download("http://arne:81/~arne/f3.html"));
        }
    }
}
Avatar billede arne_v Ekspert
17. december 2011 - 04:40 #6
kommet videre??
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester