Index: django/http/__init__.py
===================================================================
--- django/http/__init__.py	(revision 5788)
+++ django/http/__init__.py	(working copy)
@@ -47,6 +47,20 @@
     def is_secure(self):
         return os.environ.get("HTTPS") == "on"
 
+    def detect_charset(self):
+        """
+        Try to determine the encoding of the data by examining the
+        Content-Type header. To be called by classes inheriting HttpRequest.
+        """
+        if self.META.has_key('CONTENT_TYPE'):
+            ct = self.META['CONTENT_TYPE']
+            ct.lower()
+            ct.replace(' ', '')
+            i = ct.find('charset')
+            if i > 0:
+                self._encoding = ct[i+8:]
+
+        
     def _set_encoding(self, val):
         """
         Sets the encoding used for GET/POST accesses. If the GET or POST
@@ -112,10 +126,20 @@
             encoding = settings.DEFAULT_CHARSET
         self.encoding = encoding
         self._mutable = True
-        for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
-            self.appendlist(force_unicode(key, encoding, errors='replace'), force_unicode(value, encoding, errors='replace'))
+
+        try:
+            for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
+                self.appendlist(force_unicode(key, encoding, errors='strict'), force_unicode(value, encoding, errors='strict'))
+        except UnicodeDecodeError:
+            # cp1252 (Windows-1252) is ISO-8850-1 (latin-1) with additional
+            # common characters defined, this is chosen over latin-1 since
+            # most browsers say latin-1 when they really use Windows-1252
+            encoding = 'cp1252'
+            self.encoding = encoding
+            for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
+                self.appendlist(force_unicode(key, encoding, errors='replace'), force_unicode(value, encoding, errors='replace'))
         self._mutable = mutable
-
+        
     def _assert_mutable(self):
         if not self._mutable:
             raise AttributeError, "This QueryDict instance is immutable"
Index: django/core/handlers/wsgi.py
===================================================================
--- django/core/handlers/wsgi.py	(revision 5788)
+++ django/core/handlers/wsgi.py	(working copy)
@@ -77,6 +77,7 @@
         self.path = force_unicode(environ['PATH_INFO'])
         self.META = environ
         self.method = environ['REQUEST_METHOD'].upper()
+        self.detect_charset()
 
     def __repr__(self):
         # Since this is called as part of error handling, we need to be very
