Avatar billede carstenknudsen Nybegynder
14. april 2003 - 10:31 Der er 16 kommentarer og
1 løsning

Charset problem med danske bogstaver

Jeg har skrevet en MailServer der benytter smtp protokollen til at modtage e-mails. Det virker fint, bortset fra at de danske bogstaver æøåÆØÅ modtages som =E6=F8=E5=C6=D8=C5. Jeg detekterer hvilket charset der bruges, men jeg er ikke sikker på hvordan jeg skal sørge for at de bliver omkodet korrekt. Problemet er det samme hvis posten kommer som iso-8859-1 og utf-8. Spørgsmålet er altså, hvordan benytter jeg Charset (og dens metoder encode/decode) til at konvertere så jeg får beskeden til iso-8859-1 med korrekte danske bogstaver.
Avatar billede arne_v Ekspert
14. april 2003 - 12:14 #1
=E6=F8=E5=C6=D8=C5 er det man kalder quoted-printable.

Det er ikke comme-il-faut at sende 8 bit karakterer med SMTP, derfor
bliver de encoded.

(det er bare = og så den hexadecimale kode for tegnet)
Avatar billede arne_v Ekspert
14. april 2003 - 12:34 #2
javax.mail.internet.MailUtility klassen kan decode den korrekt.

Eksempel:

import java.io.*;

import javax.mail.*;
import javax.mail.internet.*;

public class QP {

    public static void main(String[] args) {
        String s = "=E6=F8=E5=C6=D8=C5";
        try {
            InputStream is = MimeUtility.decode(new ByteArrayInputStream(s.getBytes()),"quoted-printable");
            byte[] b = new byte[6];
            is.read(b);
            System.out.println(new String(b));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
14. april 2003 - 12:36 #3
Den faktisk kode kommer nok ikke til at ligne ovenstående, da
du formentlig står med en stream og ikke med en String.

Men pointen er  MimeUtility.decode !
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 12:42 #4
Det ser interessant ud, jeg skal nok kigge på det og afprøve det.
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 14:01 #5
Jeg har gjort følgende hvor jeg har fået en Socket s:
InputStream is = s.getInputStream();
is = MimeUtility.decode( is, "quoted-printable" );
dernæst pakkes denne ind i en Reader. Begge is assignments
returnerer noget fornuftigt, men så hænger programmet bare og
kommer ikke videre. Nogen ide?
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 14:14 #6
I stedet for at læse hele streamen (som ikke så ud til at virke) benytter jeg dit forslag lokalt med en reader efter at jeg har læst teksten, men så kommer det her ud:
abcᅵᅵᅵxyz
i stedet for det sendte abcæøåxyz
Nogen ide?
Avatar billede arne_v Ekspert
14. april 2003 - 14:18 #7
Mystisk.

Virker mit standalone eksempel som det skal på disn maskine ?

Hvordan ser abcæøåxyz ud encoded ?
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 14:31 #8
Dit testprogram smider følgende ud:
ᅵᅵᅵᅵᅵᅵ
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 14:32 #9
så det virker vel egentlig ikke.
Avatar billede arne_v Ekspert
14. april 2003 - 14:34 #10
Det skriver pænt æøåÆØÅ ud hos mig.

(SUN JDK 1.3.1 Win32)
Avatar billede arne_v Ekspert
14. april 2003 - 14:35 #11
Lad mig gætte: du kører Linux eller Unix et eller andet.

Jeg har lidt mistanke til at det er et UTF-8 versus ISO-8859-1
problem.
Avatar billede arne_v Ekspert
14. april 2003 - 14:41 #12
Virker:

import java.io.*;

import javax.mail.*;
import javax.mail.internet.*;

public class QP {

    public static void main(String[] args) {
        String s = "=E6=F8=E5=C6=D8=C5";
        try {
            InputStream is = MimeUtility.decode(new ByteArrayInputStream(s.getBytes()),"quoted-printable");
            byte[] b = new byte[6];
            is.read(b);
            System.out.println(new String(b, "ISO-8859-1"));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

?
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 14:43 #13
Ja, jeg kører Linux. Normalt ser den ikke ud til at have problemer med æøå, men i dette tilfælde virker det altså ikke. Burde man ikke på en eller anden måde udnytte den information der ligger i den encoding der bliver nævnt i e-mailens headere (det var det jeg først forsøgte, men jeg kunne ikke få Charsets til at virke)?
Avatar billede carstenknudsen Nybegynder
14. april 2003 - 15:04 #14
Den nye kode giver istedet:
ÊÞåÃÃÃ
Avatar billede carstenknudsen Nybegynder
15. april 2003 - 10:56 #15
Jeg laver pt bare en manuel oversættelse af de koder jeg kender til, men det er dog ærgerligt ikke at have en lille elagant løsning.
Avatar billede arne_v Ekspert
15. april 2003 - 11:14 #16
Det er ikke svært at lave en helt generel decode:

=nn (n=0..F) => et bogstav med hexadecimal værdi nn i ISO-8859-1

=\n => ingenting

Det er såmænd alt.
Avatar billede carstenknudsen Nybegynder
15. april 2003 - 11:51 #17
Som matematiker er jeg ikke helt overbevist:
Så løser vi ligningen med x=10.
Tak for kommentarerne.
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