2010-11-11 2 views
5

У меня есть текст: « икота gyötörheti атаковать шведов, так много в последнее время упоминается еще раз к шведской модели в Венгрии.»специальные символы заменить

В вреда все оригинальный текст есть ни одна строка не сломается в.

Когда я по электронной почте этот текст (с Gmail), я получаю это закодировано как:

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. 

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

....

Когда я пытаюсь для разбора электронной почты тела как текст/равнины, я не могу избавиться от знака = в «mostans = = версия E1G изм = E9t» Между этих двух слов. Обратите внимание, что тот же символ отсутствует в HTML закодированного сообщения. Я не имею ни малейшего представления, что может быть больно особый характер, но мне нужно, чтобы вернуться к ликвидации оригинального текста.

Я попытался заменить «\ п», но это не одна боли, если я ударил «Enter» в тексте, я могу заменить его правильно любой характер я хочу его. Я также попробовал, и «\ г», «\ т».

Таким образом, вопрос, что мне не хватает? Где больно специальный символ пришел? Является ли это из-за charser и/или передачи кодирования? Если да, то я должен сделать, чтобы решить эту проблему и получить обратно исходный текст.

Любая помощь будет приветствоваться.

Приветствие, Болаж

ответ

3

Вы должны использовать MimeUtility .Здесь пример.

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

Файл 'мим' содержит закодированный текст:

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

UPDATE:

Использование Guava библиотеки:

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

так в «выходе» лишние «=«s уже Ликвидировать? @ Мэри –

+0

Балаж Немет: Устранить это да, но я вижу дополнительный символ новой строки, который не был там в оригинале text.Maybe как то, что он говорит jarnbjo больно «кавычко печати» запрещает закодированные строки Exceed длиной 76 символов. @ Мэри – Emil

+0

Балаж Немет: Читайте о [Цитируется-печать] (http://en.wikipedia.org/wiki/Quoted-printable) .Это поможет вам понять, о кодировке. – Emil

2

Кодирование передачи «кавычко печати» запрещает закодированные строки Exceed длины 76 символов. Если текст, который будет закодирован содержит более длинные строки текста, «мягкая линия разрыв» должен быть вставлен, который обозначен сингл «=» в качестве последнего символа закодированной строки. Это больно Средствами разрыв строки только вставляется Выполнит ограничение 76 символов и повредить следующий разрыв строк должны быть удален При декодировании кодирования передачи.

+0

Чтобы добавить к этому, линия Скорее всего, перерыв даже «\ Р \ п», а не только «\ г» или «\ п». Это не только –

+1

Скорее всего, но обязательное. Только CRLF (\ г \ п) разрывы строк допустимы в кавычках печати. – jarnbjo