Java: кодировать строку в кавычках для печати

Я ищу способ quoted-printable кодировать строку в Java так же, как собственный php quoted_printable_encode() функция.

Я пытался использовать библиотеку JavaMails MimeUtility. Но я не могу получить encode(java.io.OutputStream os, java.lang.String encoding) для работы, так как он принимает OutputStream в качестве входных данных вместо строки (я использовал функцию getBytes() для преобразования строки) и выводит что-то, что я не могу вернуть обратно в Строка (я новичок в Java :)

Может ли кто-нибудь дать мне совет о том, как написать оболочку, которая преобразует строку в OutputStream и выводит результат в виде строки после ее кодирования?


person Horen    schedule 05.02.2014    source источник
comment
Вы можете использовать ByteArrayOutputStream чтобы получить данные в памяти.   -  person PeterMmm    schedule 05.02.2014


Ответы (2)


Чтобы использовать этот метод MimeUtility, вы должны создать ByteArrayOutputStream, который будет накапливать записанные в него байты, которые вы затем сможете восстановить. Например, чтобы закодировать строку original:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream encodedOut = MimeUtility.encode(baos, "quoted-printable");
encodedOut.write(original.getBytes());
String encoded = baos.toString();

encodeText из того же класса будет работать со строками, но производит Q-кодирование, т.е. похоже на quote-printable, но не совсем то же самое:

String encoded = MimeUtility.encodeText(original, null, "Q");
person Joni    schedule 05.02.2014
comment
Это выводит =?UTF-8?Q?H=C3=A4tte?= вместо ожидаемого H=C3=A4tte для MimeUtility.encodeText("Hätte", null, "Q"); и не добавляет разрывов строк, поэтому у меня это не работает. - person Horen; 05.02.2014
comment
Вы пытаетесь закодировать заголовок или тело сообщения mime? - person Joni; 05.02.2014
comment
Я пытаюсь закодировать тело, но я не использую JavaMail для всего. Мне просто нужна кодировка в кавычках. - person Horen; 05.02.2014
comment
См. обновление, чтобы узнать, как использовать метод encode. Проект Apache Commons Codec также реализует кавычки-printable, но также не добавляет разрыва строки (commons.apache.org/proper/commons-codec/archives/1.9/apidocs/) - person Joni; 06.02.2014

Вот что мне помогает

    @Test
public void koi8r() {
    String input = "=5F=F4=ED=5F15=2E05=2E";
    String decode = decode(input, "KOI8-R", "quoted-printable", "KOI8-R");
    Assertions.assertEquals("_ТМ_15.05.", decode);
}

public static String decode(String text, String textEncoding, String encoding, String charset) {
    if (text.length() == 0) {
        return text;
    }

    try {
        byte[] asciiBytes = text.getBytes(textEncoding);
        InputStream decodedStream = MimeUtility.decode(new ByteArrayInputStream(asciiBytes), encoding);
        byte[] tmp = new byte[asciiBytes.length];
        int n = decodedStream.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return new String(res, charset);
    } catch (IOException | MessagingException e) {
        return text;
    }
}
person Bestows In Constructing    schedule 13.05.2020
comment
Если вы используете Java ›= 9, вызовите decodedStream.readAllBytes(): stackoverflow.com/a/37681322/458157 textEncoding — это кодировка, вы должны переименовать эту переменную. - person gouessej; 12.12.2020