Java специальные символы заменяют - PullRequest
5 голосов
/ 11 ноября 2010

У меня есть текст: " Csuklási roham gyötörheti a svédeket, annyit emlegetik mostanság is me sdé modellt Magyarországon. "

В этом оригинальном тексте вообще нет разрывов строк.

Когда я отправляю этот текст по электронной почте (с помощью 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 =" ism = E9t "между двумя словами. Обратите внимание, что в сообщении в кодировке HTML отсутствует один и тот же символ. Я понятия не имею, каким может быть этот специальный символ, но мне нужно исключить его, чтобы вернуть исходный текст.

Я пытался заменить '\ n', но это не так, если я нажму 'Enter' в тексте, я могу правильно заменить его на любой символ, который мне нужен. Я также пробовал '\ r' и '\ t'.

Итак, вопрос в том, чего мне не хватает? Откуда этот особенный персонаж? Это из-за кодировщика и / или кодировки передачи? Если так, что мне нужно сделать, чтобы решить проблему и вернуть исходный текст.

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

Cheers, Балаж

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Вам необходимо использовать 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 "";
        }
    }
}

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

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

ОБНОВЛЕНИЕ:

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

    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);
2 голосов
/ 11 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...