diff --git a/django/http/request.py b/django/http/request.py
index c87a4c5..94f08ff 100644
--- a/django/http/request.py
+++ b/django/http/request.py
@@ -329,8 +329,12 @@ class QueryDict(MultiValueDict):
         self.encoding = encoding
         if six.PY3:
             if isinstance(query_string, bytes):
-                # query_string contains URL-encoded data, a subset of ASCII.
-                query_string = query_string.decode()
+                # query_string normally contains URL-encoded data, a subset of ASCII.
+                try:
+                    query_string = query_string.decode()
+                except UnicodeDecodeError:
+                    # ... but some user agents are misbehaving :-(
+                    query_string = query_string.decode('latin1')
             for key, value in parse_qsl(query_string or '',
                                         keep_blank_values=True,
                                         encoding=encoding):
diff --git a/tests/handlers/tests.py b/tests/handlers/tests.py
index 178f42d..b8bc696 100644
--- a/tests/handlers/tests.py
+++ b/tests/handlers/tests.py
@@ -44,12 +44,16 @@ class HandlerTests(TestCase):
     def test_non_ascii_query_string(self):
         """Test that non-ASCII query strings are properly decoded (#20530)."""
         environ = RequestFactory().get('/').environ
-        raw_query_string = 'want=café'
-        if six.PY3:
-            raw_query_string = raw_query_string.encode('utf-8').decode('iso-8859-1')
-        environ['QUERY_STRING'] = raw_query_string
-        request = WSGIRequest(environ)
-        self.assertEqual(request.GET['want'], "café")
+        raw_query_strings = ['want=café', 'want=cafÃ', 'want=cafÃ©']
+        got = []
+        for raw_query_string in raw_query_strings:
+            environ['QUERY_STRING'] = raw_query_string
+            request = WSGIRequest(environ)
+            got.append(request.GET['want'])
+        if six.PY2:
+            self.assertListEqual(got, ['café', 'cafÃ', 'cafÃ©'])
+        else:
+            self.assertListEqual(got, ['café', 'cafÃ', 'café'])
 
     def test_non_ascii_cookie(self):
         """Test that non-ASCII cookies set in JavaScript are properly decoded (#20557)."""
