Avatar billede qumle Nybegynder
20. februar 2006 - 16:06 Der er 7 kommentarer og
1 løsning

konvertere html entity til character

Hej eksperter

Jeg har et content management system hvor brugerne kan oprette indhold med en HTML editor, dvs de kan oprette tabeller, bullet points, vælge font osv...
det oprettede indhold gemmes så i en xml fil som jeg kan læse.

Alt dette virker helt fint men med special tegn har jeg et problem.
alle special tegn gemmes som html entities, dvs & gemmes som & osv.

det vil selvfølgelig blive præsenteret korrekt i browseren men jeg skal også bruge tekst strengen til nogle andre ting på serveren inden jeg præsenterer det for clienten.

så mit spørgsmål er ganske simpelt:
har java ikke et api til at konvertere html entities til characterer, altså fra & til &
Avatar billede arne_v Ekspert
20. februar 2006 - 18:25 #1
nej

du skal enten lave en primitiv replace eller finde et par HtmlEncode & HtmlDecode
klasser paa nettet

de findes
Avatar billede qumle Nybegynder
20. februar 2006 - 18:42 #2
ØV :(

jeg har desperat prøvet at finde sådan nogle klasser man kan benytte sig af, men jeg synes hele tiden at de enten er bygget ind i et eller andet meget avanceret tool som koster penge eller også har folk bare selv lavet deres egne mapping lister.
har du nogle links til sådanne klasser?

Men ok det ser ud som om det er vejen at gå, det synes jeg bare ikke er særlig fedt mht vedligeholdelse osv, jeg ved godt at der ikke kommer nye tegn hver dag men vores site skal højst sandsynligt udvides til mellemøsten og asien, og så kunne man godt forestille sig at der dukkede nogle spøjse tegn op.

så dit løsningsforslag ville være at hardcode denne liste ind i applikationen
http://www.w3schools.com/tags/ref_entities.asp
føj det syns jeg godt nok er grimt plus at jeg sikkert også får brug for andre iso coder

jeg undrer mig meget over hvorfor der ikke findes en HTML entity encoder/decoder når nu der findes f.eks en url encoder.

i entity listen på w3 er der også angivet "entity number" som er & for &.
dette tal kan konverteres til en char ved simpel typecast, men der findes vel heller ikke en måde at konvertere fra html entity til entity number?
Avatar billede arne_v Ekspert
20. februar 2006 - 20:12 #3
jeg kan godt forstaa at du undres

jeg tror at strategien idag er:
  - kun bruge entitet for <>&
  - bruge UTF-8 og have alle special tegn as is
Avatar billede qumle Nybegynder
21. februar 2006 - 11:31 #5
ja det er også hvad jeg er kommet frem til. det lader kun til at den editor jeg bruger escaper netop < > &.

jeg er bare i tvivl om hvad der sker når vi begynder at bruge andre tegnsæt.
Men jeg må jo lave noget ala ovenstående.

inden jeg så dit link havde jeg lavet det med et hashtable og så bare brugt String.replaceAll(key,value);


Mit eksempel:
public static String convertHtmlEntities2Text(String input){
        System.out.println("HtmlEntity2.printEntity()");
        System.out.println("input: "+input);
       
        String entity = "";
        String value = "";
        String output = input;
       
       
        Iterator iterator = entityMapping.keySet().iterator();
       
        while (iterator.hasNext()) {
            entity = (String) iterator.next();
            value = (String)entityMapping.get(entity);
            output = output.replaceAll(entity, value);
        }
       
        return output;
    }


i det eksempel du kommer med bruges der regulsr expression, giver det bedre performance eller er der andre grunde til at bruge regex i stedet?

Jakarta eksempel:
static Pattern pattern = Pattern.compile("&([a-z]+);");
public static String decode(String content) {

        // FIXME(performance): do I have existing code that does this more
        // efficiently?

        StringBuffer buff = new StringBuffer(content.length());

        Matcher m = pattern.matcher(content);

        int index = 0;
        while (m.find()) {

            // figure out which entity to escape or just include it.

            buff.append(content.substring(index, m.start(0)));

            String entity = m.group(1);

            if (entities.containsKey(entity)) {
                buff.append(entities.get(entity));
            } else {
                // found an entity we no NOTHING about. Should we warn?

                buff.append(m.group(0));
            }

            index = m.end(0);

        }

        buff.append(content.substring(index, content.length()));

        return buff.toString();

    }
Avatar billede arne_v Ekspert
21. februar 2006 - 18:08 #6
snarere daarliger eperformance

men man kan fange de ukendte (det goer de saa bare ikke)
Avatar billede qumle Nybegynder
22. februar 2006 - 23:04 #7
hmm ok jeg valgte også at lave den med replaceAll mest fordi jeg synes det er mere læsbart.

Jeg valgte at bruge et hashMap til at lagre entities oig værdier i. Nu er jeg ikke lige så stærk i collection api'et men jeg mente det måtte være passende?

lægger du lige t svar for dine input
Avatar billede arne_v Ekspert
22. februar 2006 - 23:12 #8
he he

jakarta bruger ogsaa HashMap saa det er naeppe helt forkert omend andet sikkert
ogsaa kan bruges

og et svar fra mig
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