percent-encoded sequences into Unicode characters, as accepted by the
:meth:`bytes.decode` method.
- *string* must be a :class:`str`.
+ *string* may be either a :class:`str` or a :class:`bytes`.
*encoding* defaults to ``'utf-8'``.
*errors* defaults to ``'replace'``, meaning invalid sequences are replaced
Example: ``unquote('/El%20Ni%C3%B1o/')`` yields ``'/El NiƱo/'``.
+ .. versionchanged:: 3.9
+ *string* parameter supports bytes and str objects (previously only str).
+
+
+
.. function:: unquote_plus(string, encoding='utf-8', errors='replace')
"%s" % result)
self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, None)
self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, ())
- with support.check_warnings(('', BytesWarning), quiet=True):
- self.assertRaises((TypeError, AttributeError), urllib.parse.unquote, b'')
def test_unquoting_badpercent(self):
# Test unquoting on bad percent-escapes
self.assertEqual(expect, result,
"using unquote(): %r != %r" % (expect, result))
+ def test_unquoting_with_bytes_input(self):
+ # ASCII characters decoded to a string
+ given = b'blueberryjam'
+ expect = 'blueberryjam'
+ result = urllib.parse.unquote(given)
+ self.assertEqual(expect, result,
+ "using unquote(): %r != %r" % (expect, result))
+
+ # A mix of non-ASCII hex-encoded characters and ASCII characters
+ given = b'bl\xc3\xa5b\xc3\xa6rsyltet\xc3\xb8y'
+ expect = 'bl\u00e5b\u00e6rsyltet\u00f8y'
+ result = urllib.parse.unquote(given)
+ self.assertEqual(expect, result,
+ "using unquote(): %r != %r" % (expect, result))
+
+ # A mix of non-ASCII percent-encoded characters and ASCII characters
+ given = b'bl%c3%a5b%c3%a6rsyltet%c3%b8j'
+ expect = 'bl\u00e5b\u00e6rsyltet\u00f8j'
+ result = urllib.parse.unquote(given)
+ self.assertEqual(expect, result,
+ "using unquote(): %r != %r" % (expect, result))
+
+
class urlencode_Tests(unittest.TestCase):
"""Tests for urlencode()"""