Avatar billede eonix Nybegynder
31. august 2007 - 13:03 Der er 3 kommentarer og
1 løsning

Hvordan bestemmes HTML's CHARSET (Signature/Preamble)

Hej folkens,

Som en forlængelse af denne post [http://www.eksperten.dk/spm/793769], har jeg følgende spørgsmål.

Hvis HTML'en ikke hentes ned i den rigtige encoding/charset, så bliver det noget være ROD. Så hvordan bestemmer jeg lige hvilket CHARSET html'en er skrevet med?

Hvordan klares den lige?
Avatar billede arne_v Ekspert
31. august 2007 - 16:49 #1
Det er desvaerre lidt rodet.

Du bliver nok noedt til at checke baade HTTP header og META tags og saa skifte
Reader naar du ved hvad det er.

Jeg kan bixe et eksempel senere.
Avatar billede arne_v Ekspert
28. november 2008 - 01:41 #2
Jeg ved godt at spørgsmålet er halvandet år gammelt, men hvis nogen finder det
ved søgning, så er her en løsning:

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HttpDownloadCharset {
    private static Pattern encpat = Pattern.compile("charset=([A-Za-z0-9-]+)", Pattern.CASE_INSENSITIVE);
    private static String parseContentType(String contenttype) {
        Matcher m = encpat.matcher(contenttype);
        if(m.find()) {
            return m.group(1);
        } else {
            return "ISO-8859-1";
        }
    }
    private static Pattern metaencpat = Pattern.compile("<META\\s+HTTP-EQUIV\\s*=\\s*[\"']Content-Type[\"']\\s+CONTENT\\s*=\\s*[\"']([^\"']*)[\"']>", Pattern.CASE_INSENSITIVE);
    private static String parseMetaContentType(String html, String defenc) {
        Matcher m = metaencpat.matcher(html);
        if(m.find()) {
            return parseContentType(m.group(1));
        } else {
            return defenc;
        }
    }
    private static final int DEFAULT_BUFSIZ = 1000000;
    public static String download(String urlstr) throws IOException {
        URL url = new URL(urlstr);
        HttpURLConnection con = (HttpURLConnection)url.openConnection();
        con.connect();
        if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
            String enc = parseContentType(con.getContentType());
            int bufsiz = con.getContentLength();
            if(bufsiz < 0) {
                bufsiz = DEFAULT_BUFSIZ;
            }
            byte[] buf = new byte[bufsiz];
            InputStream is = con.getInputStream();
            int ix = 0;
            int n;
            while((n = is.read(buf, ix, buf.length - ix)) > 0) {
                ix += n;
            }
            is.close();
            con.disconnect();
            String temp = new String(buf, "US-ASCII");
            enc = parseMetaContentType(temp, enc);
            return new String(buf, enc);
        } else {
            con.disconnect();
            throw new IllegalArgumentException("URL " + urlstr + " returned " + con.getResponseMessage());
        }
    }
    public static void main(String[] args) throws Exception {
        System.out.println(download("http://arne:81/~arne/f1.html"));
        System.out.println(download("http://arne:81/~arne/f2.html"));
        System.out.println(download("http://arne:81/~arne/f3.html"));
    }
}
Avatar billede eonix Nybegynder
14. august 2009 - 11:28 #3
Siger supertak for din indsats Arne.

Håber andre fik glæde af det - vil se om jeg kan bruge det i fremtiden :)
Avatar billede arne_v Ekspert
14. august 2009 - 22:18 #4
En anden gang skal jeg nok lade være med at poste en løsning.
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
Kategori
Kurser inden for grundlæggende programmering

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

IT-JOB