Как декодировать цитируемые символы (от цитируемых до символа)? - PullRequest
5 голосов
/ 05 сентября 2011

У меня есть текст с quoted-printables .Вот пример такого текста (из статьи в Википедии ):

Если вы верите, что истина = 3Dbeauty, то, безусловно, математика является наиболеепрекрасная ветвь философии.

Я ищу класс Java, который декодирует закодированную форму в символы, например, = 20 в пробел.

ОБНОВЛЕНИЕ: Благодаря Elite Gentleman, я знаю, что мне нужно использовать QuotedPrintableCodec:

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.net.QuotedPrintableCodec;
import org.junit.Test;

public class QuotedPrintableCodecTest { 
private static final String TXT =  "If you believe that truth=3Dbeauty, then surely=20=mathematics is the most beautiful branch of philosophy.";

    @Test
    public void processSimpleText() throws DecoderException
    {
        QuotedPrintableCodec.decodeQuotedPrintable( TXT.getBytes() );           
    }
}   

Однако я продолжаю получать следующее исключение:

org.apache.commons.codec.DecoderException: Invalid URL encoding: not a valid digit (radix 16): 109
    at org.apache.commons.codec.net.Utils.digit16(Utils.java:44)
    at org.apache.commons.codec.net.QuotedPrintableCodec.decodeQuotedPrintable(QuotedPrintableCodec.java:186)

Что я делаю не так?

ОБНОВЛЕНИЕ 2: Я нашел этот вопрос @ SO и узнал о MimeUtility :

import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;

public class QuotedPrintableCodecTest {
    private static final String TXT =  "If you believe that truth=3Dbeauty, then surely=20= mathematics is the most beautiful branch of philosophy.";

    @Test
    public void processSimpleText() throws MessagingException, IOException  
    {
        InputStream is = new ByteArrayInputStream(TXT.getBytes());

            BufferedReader br = new BufferedReader ( new InputStreamReader(  MimeUtility.decode(is, "quoted-printable") ));         
            StringWriter writer = new StringWriter(); 

            String line;
            while( (line = br.readLine() ) != null )
            {
                writer.append(line);
            }
            System.out.println("INPUT:  "  + TXT);
            System.out.println("OUTPUT: " +  writer.toString() );       
    }
    }

Однако вывод все еще не идеален, этосодержит '=':

INPUT:  If you believe that truth=3Dbeauty, then surely=20= mathematics is the most beautiful branch of philosophy.
OUTPUT: If you believe that truth=beauty, then surely = mathematics is the most beautiful branch of philosophy.

Что я делаю не так?

1 Ответ

9 голосов
/ 05 сентября 2011

Кодек Apache Commons Класс QuotedPrintableCodec является реализацией секции RFC 1521 Quoted-Printable.


Update, Ваша строка для печати в кавычках неверна, так как в примере в Википедии используются разрывы Soft-line.

Разрывы мягких линий:

Rule #5 (Soft Line Breaks): The Quoted-Printable encoding REQUIRES
      that encoded lines be no more than 76 characters long. If longer
      lines are to be encoded with the Quoted-Printable encoding, 'soft'
      line breaks must be used. An equal sign as the last character on a
      encoded line indicates such a non-significant ('soft') line break
      in the encoded text. Thus if the "raw" form of the line is a
      single unencoded line that says:

          Now's the time for all folk to come to the aid of
          their country.

      This can be represented, in the Quoted-Printable encoding, as

          Now's the time =
          for all folk to come=
           to the aid of their country.

      This provides a mechanism with which long lines are encoded in
      such a way as to be restored by the user agent.  The 76 character
      limit does not count the trailing CRLF, but counts all other
      characters, including any equal signs.

Итак, ваш текст должен быть составлен следующим образом:

private static final String CRLF = "\r\n";
private static final String S = "If you believe that truth=3Dbeauty, then surely=20=" + CRLF + "mathematics is the most beautiful branch of philosophy.";

В Javadoc четко сказано:

Правила № 3, № 4 и № 5 спецификации для печати в кавычках не реализованы все же, потому что полная спецификация для печати в кавычках не поддается хорошо в байтовой [] ориентированной структуре кодека. Завершите кодек один раз готовая структура кодека готова. Мотивация позади предоставление кодека в частичной форме заключается в том, что он уже может войти в удобно для тех приложений, которые не требуют цитируемой печатной строки форматирование (правила № 3, № 4, № 5), например, кодек Q.

И есть ошибка , зарегистрированная для Apache QuotedPrintableCodec, поскольку она не поддерживает разрывы программных линий.

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