7

For example, I have a string "this=20is=20a=20string" that I want to convert to "this is a string".

snakecharmerb
  • 47,570
  • 11
  • 100
  • 153
dan gibson
  • 3,605
  • 3
  • 39
  • 57

4 Answers4

8

Use mimelib:

var mimelib = require("mimelib");
mimelib.decodeQuotedPrintable("this=20is=20a=20string") === "this is a string"
mimelib.decodeMimeWord("=?iso-8859-1?Q?=27text=27?=") === "'text'"
snies
  • 3,461
  • 1
  • 22
  • 19
dan gibson
  • 3,605
  • 3
  • 39
  • 57
1

function decodeQuotedPrintable(data)
{
    // normalise end-of-line signals 
    data = data.replace(/(\r\n|\n|\r)/g, "\n");
        
    // replace equals sign at end-of-line with nothing
    data = data.replace(/=\n/g, "");

    // encoded text might contain percent signs
    // decode each section separately
    let bits = data.split("%");
    for (let i = 0; i < bits.length; i ++)
    {
        // replace equals sign with percent sign
        bits[i] = bits[i].replace(/=/g, "%");
        
        // decode the section
        bits[i] = decodeURIComponent(bits[i]);
    }
        
    // join the sections back together
    return(bits.join("%"));
}

1

The quoted-printable package can be used for quoted printable encoding and decoding.

> var utf8 = require('utf8')
undefined
> var quotedPrintable = require('quoted-printable');
undefined
> var s = 'this=20is=20a=20string'
undefined
> utf8.decode(quotedPrintable.decode(s))
'this is a string'
> quotedPrintable.encode(utf8.encode('this is a string'))
'this is a string'
snakecharmerb
  • 47,570
  • 11
  • 100
  • 153
1

Here a variant where you can specify the charset:

function decodeQuotedPrintable(raw, charset='utf-8') {
    const dc = new TextDecoder(charset);
    return raw.replace(/[\t\x20]$/gm, "").replace(/=(?:\r\n?|\n)/g, "").replace(/((?:=[a-fA-F0-9]{2})+)/g, (m) => {
        const cd = m.substring(1).split('='), uArr=new Uint8Array(cd.length);
        for (let i = 0; i < cd.length; i++) {
            uArr[i] = parseInt(cd[i], 16);
        }
        return dc.decode(uArr);
    });
}

console.log(decodeQuotedPrintable('Freundliche Gr=C3=BCsse'));              // "Freundliche Grüsse"
console.log(decodeQuotedPrintable('I love =F0=9F=8D=95'));                  // "I love "
console.log(decodeQuotedPrintable('Freundliche Gr=FCsse', 'ISO-8859-1'));   // "Freundliche Grüsse"
console.log(decodeQuotedPrintable('Freundliche Gr=9Fsse', 'macintosh'));    // "Freundliche Grüsse"
Lukas
  • 23
  • 3