2010-11-11 21 views
5

tengo el texto: " hipo gyötörheti atacar a los suecos, tanto en los últimos refirió una vez más al modelo sueco en Hungría."reemplazar caracteres especiales

En todos los daños texto original No hay saltos de línea en.

Cuando envía este texto (con Gmail), lo entiendo codificada de la siguiente manera:

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. 

En 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. 

....

Cuando intento para analizar el cuerpo del correo electrónico, text/plain, no puedo deshacerme del signo = en "mostans = = E1G ismo = E9t" entre las dos palabras. Tenga en cuenta que el mismo personaje no aparece en el mensaje HTML codificado. No tengo ni idea de lo que podría ser herido de carácter especial, pero lo necesito para volver a Eliminar el texto original.

Me trataron de reemplazar '\ n', pero no es una herida, si pulsa 'Enter' en el texto, puedo reemplazarlo correctamente a cualquier personaje que yo quiero que haga. También probé, y '\ r', '\ t'.

Entonces la pregunta es, ¿Qué me falta? ¿De dónde viene carácter especial daño viene? Es a causa de la charser y/o la transferencia de codificación? Si es así, ¿qué tengo que hacer para resolver el problema y volver al texto original.

Cualquier ayuda sería bienvenida.

Cheers, Balázs

Respuesta

3

Es necesario utilizar MimeUtility .Aquí es un ejemplo.

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 ""; 
     } 
    } 
} 

El archivo 'mimo' contiene texto codificado:

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

ACTUALIZACIÓN:

Usando Guava biblioteca:

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

también lo son en la "salida" los innecesarios "= 's ya los Alimentos? @ María –

+0

Balázs Németh: Eliminar sí lo es, pero veo un salto de línea extra que no estaba allí en el text.Maybe original, como lo que dice jarnbjo daño a las líneas "QP" prohíbe codificados a exceder una longitud de 76 caracteres. @ María – Emil

+0

Balázs Németh: Lea acerca de la [QP] (http://en.wikipedia.org/wiki/Quoted-printable) .Este le ayudará a entender acerca de la codificación. – Emil

2

La codificación de transferencia es "citado imprimible" prohíbe líneas codificadas a exceder una longitud de 76 caracteres. Si el texto a codificar contiene líneas de texto más largos, el "salto de línea blanda" tiene que ser insertado, que se indica con el single '=' como el último carácter de una línea codificada. Le duele el salto de línea significa seguir solamente se inserta para cumplir con la restricción de 76 caracteres y herido el salto de línea que sigue debe ser removido cuando la decodificación de la codificación de transferencia.

+0

Para añadir a esto, la línea ruptura probable que incluso "\ R \ n", no sólo "\ n" "\ r" o. No es sólo –

+1

probable, pero obligatorio. Sólo CRLF (\ r \ n) saltos de línea están permitidos en citado imprimible. – jarnbjo

Cuestiones relacionadas