'Java: Encode String in quoted-printable

I am looking for a way to quoted-printable encode a string in Java just like php's native quoted_printable_encode() function.

I have tried to use JavaMails's MimeUtility library. But I cannot get the encode(java.io.OutputStream os, java.lang.String encoding) method to work since it is taking an OutputStream as input instead of a String (I used the function getBytes() to convert the String) and outputs something that I cannot get back to a String (I'm a Java noob :)

Can anyone give me tips on how to write a wrapper that converts a String into an OutputStream and outputs the result as a String after encoding it?



Solution 1:[1]

To use this MimeUtility method you have to create a ByteArrayOutputStream which will accumulate the bytes written to it, which you can then recover. For example, to encode the string original:

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

The encodeText function from the same class will work on strings, but it produces Q-encoding, which is similar to quoted-printable but not quite the same:

String encoded = MimeUtility.encodeText(original, null, "Q");

Solution 2:[2]

Thats what helps me

@Test
public void koi8r() {
    String input = "=?koi8-r?Q?11=5F=F4=ED=5F21=2E05=2Erar?=";
    String decode = EncodingUtils.decodeKoi8r(input);
    Assertions.assertEquals("11_??_21.05.rar", decode);
}

@Test
public void koi8rWithoutStartTag() {
    String input = "=CF=D4=C4=C5=CC=D8=CE=D9=CD =D4=D2=C1=CE=DB=C5=CD =D2=C5=DA=C0=CD=.eml";
    String decode = EncodingUtils.decodeKoi8r(input);
    Assertions.assertEquals("????????? ??????? ?????=.eml", decode);
}


public static String decodeKoi8r(String text) {
    String decode;
    try {
        decode = MimeUtility.decodeText(text);
    } catch (UnsupportedEncodingException e) {
        decode = text;
    }

    if (isQuotedKoi8r(decode)) {
        decode = decode(text, "KOI8-R", "quoted-printable", "KOI8-R");
    }
    return decode;
}

public static boolean isQuotedKoi8r(String text) {
    return text.contains("=") || text.toLowerCase().contains("koi8-r");
}

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

    try {
        byte[] bytes = text.getBytes(textEncoding);
        InputStream decodedStream = MimeUtility.decode(new ByteArrayInputStream(bytes), encoding);
        byte[] tmp = new byte[bytes.length];
        int n = decodedStream.read(tmp);
        byte[] res = new byte[n];
        System.arraycopy(tmp, 0, res, 0, n);
        return new String(res, resultCharset);
    } catch (IOException | MessagingException e) {
        return text;
    }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2