2010-11-11 25 views
5

mam tekst „ czkawkę gyötörheti ataku Szwedów, tyle niedawno, o którym mowa ponownie do szwedzkiego modelu na Węgrzech” znaki specjalne zastąpić

szkodę wszystkim oryginalny tekst nie ma przerw w linii.

Kiedy wysłać ten tekst (z gmail), mam to zakodowane jak:

Content-Type: text/plain; charset=ISO-8859-2 
Content-Transfer-Encoding: quoted-printable 

Csukl=E1si roham gy=F6t=F6rheti a sv=E9deket, annyit emlegetik mostans=E1g = 
ism=E9t a 
sv=E9d modellt Magyarorsz=E1gon. 

W HTML:

Content-Type: text/html; charset=ISO-8859-2 
Content-Transfer-Encoding: quoted-printable 


<span class=3D"Apple-style-span" style=3D"font-family: Helvetica, Verdana, = sans-serif; font-size: 15px; ">Csukl=E1si roham gy=F6t=F6rheti a sv=E9deket= , annyit emlegetik mostans=E1g ism=E9t a sv=E9d modellt Magyarorsz=E1gon. 

....

Kiedy próbuję do analizowania ciała e-mail jako text/plain, nie mogę pozbyć się znaku = w „mostans = E1G = izm = E9t” Między tymi dwoma słowami. Zauważ, że ten sam znak brakuje HTML zakodowany komunikat. Nie mam pojęcia, co mogłoby zranić szczególny charakter, ale muszę to wrócić do wyeliminowania oryginalny tekst.

Próbowałem zastąpić „\ n”, ale to nie jest jeden ranny, jeśli uderzę „Enter” w tekście, mogę zastąpić go poprawnie niezależnie od charakteru chcę go. Próbowałem również, a '\ r', '\ t'.

Więc pytanie brzmi, co mi brakuje? Gdzie boli szczególny charakter pochodzi? Czy to ze względu na charser i/lub kodowania transferu? Jeśli tak, to co mam zrobić, aby rozwiązać ten problem i odzyskać oryginalny tekst.

Każda pomoc będzie mile widziane.

zdrowie Balázs

Odpowiedz

3

Trzeba użyć MimeUtility .Tutaj jest przykładem.

public class Mime { 
    public static void main(String[] args) throws MessagingException, 
      IOException { 
     InputStream stringStream = new FileInputStream("mime"); 
     InputStream output = MimeUtility.decode(stringStream, 
       "quoted-printable"); 
     System.out.println(convertStreamToString(output)); 
    } 

    public static String convertStreamToString(InputStream is) 
      throws IOException { 
     /* 
     * To convert the InputStream to String we use the Reader.read(char[] 
     * buffer) method. We iterate until the Reader return -1 which means 
     * there's no more data to read. We use the StringWriter class to 
     * produce the string. 
     */ 
     if (is != null) { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 
      try { 
       Reader reader = new BufferedReader(new InputStreamReader(is, 
         "ISO8859_1")); 
       int n; 
       while ((n = reader.read(buffer)) != -1) { 
        writer.write(buffer, 0, n); 
       } 
      } finally { 
       is.close(); 
      } 
      return writer.toString(); 
     } else { 
      return ""; 
     } 
    } 
} 

Plik 'mim' zawiera zakodowany tekst:

Csukl=E1si roham gy=F6t=F6rheti a sv=E9deket, annyit emlegetik mostans=E1g = 
ism=E9t a 
sv=E9d modellt Magyarorsz=E1gon. 

UPDATE:

Korzystanie Guava Biblioteka:

InputSupplier<InputStream> supplier = new InputSupplier<InputStream>() { 
     @Override 
     public InputStream getInput() throws IOException { 
      InputStream inStream = new FileInputStream("mime"); 
      InputStream decodedStream=null; 
      try { 
       decodedStream = MimeUtility.decode(inStream, 
       "quoted-printable"); 
      } catch (MessagingException e) { 
       e.printStackTrace(); 
      } 
      return decodedStream; 
     } 
    }; 
    InputSupplier<InputStreamReader> result = CharStreams 
    .newReaderSupplier(supplier, Charsets.ISO_8859_1); 
    String ans = CharStreams.toString(result); 
    System.out.println(ans); 
+0

więc są w „wyjściu” niepotrzebne „=„s już wyeliminować? @ Mary –

+0

Balázs Németh: Wyeliminować tak to jest, ale widzę dodatkowy znak nowej linii, który nie był tam w oryginalnym text.Maybe jak to co mówi jarnbjo boli „quoted-printable” zabrania zakodowane linie przekraczać długości 76 znaków. @ Mary – Emil

+0

Balázs Németh: Przeczytaj o [quoted-printable] (http://en.wikipedia.org/wiki/Quoted-printable) .To pomoże Ci zrozumieć o kodowaniu. – Emil

2

Kodowanie transferu „quoted-druku” zabrania kodowane linie przekraczać długości 76 znaków. Jeśli tekst do zakodowania zawiera dłuższych linii tekstu, w „miękki podział wiersza” musi być włożony, co jest sygnalizowane przez single „=” jako ostatni znak zakodowanej linii. Bolało następujących środków linia przerwa jest włożona tylko Spełnić ograniczenie 76 znaków i boli Poniższy podział wiersza powinny być usuwane przy dekodowaniu kodowanie transferu.

+0

dodać do tego, linię prawdopodobnie nawet przerwa "\ R \ n", nie tylko "\ r" lub "\ N". To nie tylko –

+1

prawdopodobne, ale obowiązkowe. Tylko CRLF (\ r \ n) końca linii są dozwolone quoted-druku. – jarnbjo