diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index 9496035cd7f..f3017da2c8f 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1284,9 +1284,9 @@ to :class:`bytes` mappings. They are not supported by :meth:`bytes.decode` +----------------------+------------------+------------------------------+------------------------------+ | Codec | Aliases | Purpose | Encoder / decoder | +======================+==================+==============================+==============================+ -| base64_codec [#b64]_ | base64, base_64 | Convert operand to MIME | :meth:`base64.b64encode` / | -| | | base64 (the result always | :meth:`base64.b64decode` | -| | | includes a trailing | | +| base64_codec [#b64]_ | base64, base_64 | Convert operand to multiline | :meth:`base64.encodebytes` / | +| | | MIME base64 (the result | :meth:`base64.decodebytes` | +| | | always includes a trailing | | | | | ``'\n'``) | | | | | | | | | | .. versionchanged:: 3.4 | | @@ -1298,14 +1298,14 @@ to :class:`bytes` mappings. They are not supported by :meth:`bytes.decode` | bz2_codec | bz2 | Compress the operand | :meth:`bz2.compress` / | | | | using bz2 | :meth:`bz2.decompress` | +----------------------+------------------+------------------------------+------------------------------+ -| hex_codec | hex | Convert operand to | :meth:`base64.b16encode` / | -| | | hexadecimal | :meth:`base64.b16decode` | +| hex_codec | hex | Convert operand to | :meth:`binascii.b2a_hex` / | +| | | hexadecimal | :meth:`binascii.a2b_hex` | | | | representation, with two | | | | | digits per byte | | +----------------------+------------------+------------------------------+------------------------------+ -| quopri_codec | quopri, | Convert operand to MIME | :meth:`quopri.encodestring` /| -| | quotedprintable, | quoted printable | :meth:`quopri.decodestring` | -| | quoted_printable | | | +| quopri_codec | quopri, | Convert operand to MIME | :meth:`quopri.encode` with | +| | quotedprintable, | quoted printable | ``quotetabs=True`` / | +| | quoted_printable | | :meth:`quopri.decode` | +----------------------+------------------+------------------------------+------------------------------+ | uu_codec | uu | Convert the operand using | :meth:`uu.encode` / | | | | uuencode | :meth:`uu.decode` | diff --git a/Lib/encodings/quopri_codec.py b/Lib/encodings/quopri_codec.py index 0533dbe4e7b..496cb7655d0 100644 --- a/Lib/encodings/quopri_codec.py +++ b/Lib/encodings/quopri_codec.py @@ -11,7 +11,7 @@ def quopri_encode(input, errors='strict'): assert errors == 'strict' f = BytesIO(input) g = BytesIO() - quopri.encode(f, g, 1) + quopri.encode(f, g, quotetabs=True) return (g.getvalue(), len(input)) def quopri_decode(input, errors='strict'): diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 6629ccd4e2b..8b78c240415 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -2613,6 +2613,14 @@ class TransformCodecTest(unittest.TestCase): info = codecs.lookup(alias) self.assertEqual(info.name, expected_name) + def test_quopri_stateless(self): + # Should encode with quotetabs=True + encoded = codecs.encode(b"space tab\teol \n", "quopri-codec") + self.assertEqual(encoded, b"space=20tab=09eol=20\n") + # But should still support unescaped tabs and spaces + unescaped = b"space tab eol\n" + self.assertEqual(codecs.decode(unescaped, "quopri-codec"), unescaped) + def test_uu_invalid(self): # Missing "begin" line self.assertRaises(ValueError, codecs.decode, b"", "uu-codec")