Index: django/utils/httpwrappers.py
===================================================================
--- django/utils/httpwrappers.py	(revision 775)
+++ django/utils/httpwrappers.py	(working copy)
@@ -139,8 +139,8 @@
     "A basic HTTP response, with content and dictionary-accessed headers"
     def __init__(self, content='', mimetype=None):
         if not mimetype:
-            from django.conf.settings import DEFAULT_MIME_TYPE
-            mimetype = DEFAULT_MIME_TYPE
+            from django.conf.settings import DEFAULT_CONTENT_TYPE, DEFAULT_CHARSET
+            mimetype = DEFAULT_CONTENT_TYPE + '; charset=' + DEFAULT_CHARSET
         self.content = content
         self.headers = {'Content-Type':mimetype}
         self.cookies = SimpleCookie()
Index: django/conf/global_settings.py
===================================================================
--- django/conf/global_settings.py	(revision 775)
+++ django/conf/global_settings.py	(working copy)
@@ -32,9 +32,11 @@
 # notifications and other various e-mails.
 MANAGERS = ADMINS
 
-# Default MIME type to use for all HttpResponse objects, if a MIME type
-# isn't manually specified. This is directly used as the Content-Type header.
-DEFAULT_MIME_TYPE = 'text/html; charset=utf-8'
+# Default content type and charset to use for all HttpResponse objects, if a MIME type
+# isn't manually specified. These are used to construct the Content-Type header
+# in the form DEFAULT_CONTENT_TYPE + '; charset=' + DEFAULT_CHARSET
+DEFAULT_CONTENT_TYPE = 'text/html'
+DEFAULT_CHARSET = 'utf-8'
 
 # E-mail address that error messages come from.
 SERVER_EMAIL = 'root@localhost'
Index: django/core/formfields.py
===================================================================
--- django/core/formfields.py	(revision 775)
+++ django/core/formfields.py	(working copy)
@@ -1,6 +1,7 @@
 from django.core import validators
 from django.core.exceptions import PermissionDenied
 from django.utils.html import escape
+from django.conf import settings
 
 FORM_FIELD_ID_PREFIX = 'id_'
 
@@ -221,7 +222,7 @@
         self.validator_list = [self.isValidLength, self.hasNoNewlines] + validator_list
 
     def isValidLength(self, data, form):
-        if data and self.maxlength and len(data) > self.maxlength:
+        if data and self.maxlength and len(data.decode(settings.DEFAULT_CHARSET)) > self.maxlength:
             raise validators.ValidationError, "Ensure your text is less than %s characters." % self.maxlength
 
     def hasNoNewlines(self, data, form):
@@ -235,7 +236,7 @@
         if self.maxlength:
             maxlength = 'maxlength="%s" ' % self.maxlength
         if isinstance(data, unicode):
-            data = data.encode('utf-8')
+            data = data.encode(settings.DEFAULT_CHARSET)
         return '<input type="text" id="%s" class="v%s%s" name="%s" size="%s" value="%s" %s/>' % \
             (FORM_FIELD_ID_PREFIX + self.field_name, self.__class__.__name__, self.is_required and ' required' or '',
             self.field_name, self.length, escape(data), maxlength)
@@ -264,7 +265,7 @@
         if data is None:
             data = ''
         if isinstance(data, unicode):
-            data = data.encode('utf-8')
+            data = data.encode(settings.DEFAULT_CHARSET)
         return '<textarea id="%s" class="v%s%s" name="%s" rows="%s" cols="%s">%s</textarea>' % \
             (FORM_FIELD_ID_PREFIX + self.field_name, self.__class__.__name__, self.is_required and ' required' or '',
             self.field_name, self.rows, self.cols, escape(data))
Index: django/core/handlers/wsgi.py
===================================================================
--- django/core/handlers/wsgi.py	(revision 775)
+++ django/core/handlers/wsgi.py	(working copy)
@@ -167,6 +167,6 @@
         response_headers = response.headers.items()
         for c in response.cookies.values():
             response_headers.append(('Set-Cookie', c.output(header='')))
-        output = [response.get_content_as_string('utf-8')]
+        output = [response.get_content_as_string(settings.DEFAULT_CHARSET)]
         start_response(status, response_headers)
         return output
Index: django/core/handlers/modpython.py
===================================================================
--- django/core/handlers/modpython.py	(revision 775)
+++ django/core/handlers/modpython.py	(working copy)
@@ -157,7 +157,8 @@
     for c in http_response.cookies.values():
         mod_python_req.headers_out.add('Set-Cookie', c.output(header=''))
     mod_python_req.status = http_response.status_code
-    mod_python_req.write(http_response.get_content_as_string('utf-8'))
+    from django.conf import settings
+    mod_python_req.write(http_response.get_content_as_string(settings.DEFAULT_CHARSET))
 
 def handler(req):
     # mod_python hooks into this function.
Index: django/core/template.py
===================================================================
--- django/core/template.py	(revision 775)
+++ django/core/template.py	(working copy)
@@ -55,6 +55,7 @@
 '\n<html>\n\n</html>\n'
 """
 import re
+from django.conf import settings
 
 __all__ = ('Template','Context','compile_string')
 
@@ -474,7 +475,7 @@
         if not isinstance(output, basestring):
             output = str(output)
         elif isinstance(output, unicode):
-            output = output.encode('utf-8')
+            output = output.encode(settings.DEFAULT_CHARSET)
         return output
 
 def register_tag(token_command, callback_function):
Index: django/middleware/common.py
===================================================================
--- django/middleware/common.py	(revision 775)
+++ django/middleware/common.py	(working copy)
@@ -78,7 +78,7 @@
 
         # Use ETags, if requested
         if settings.USE_ETAGS:
-            etag = md5.new(response.get_content_as_string('utf-8')).hexdigest()
+            etag = md5.new(response.get_content_as_string(settings.DEFAULT_CHARSET)).hexdigest()
             if request.META.get('HTTP_IF_NONE_MATCH') == etag:
                 response = httpwrappers.HttpResponseNotModified()
             else:
Index: django/middleware/cache.py
===================================================================
--- django/middleware/cache.py	(revision 775)
+++ django/middleware/cache.py	(working copy)
@@ -76,7 +76,7 @@
         Sets the cache, if needed.
         """
         if request._cache_middleware_set_cache:
-            content = response.get_content_as_string('utf-8')
+            content = response.get_content_as_string(settings.DEFAULT_CHARSET)
             if request._cache_middleware_accepts_gzip:
                 content = compress_string(content)
                 response.content = content
Index: django/views/decorators/cache.py
===================================================================
--- django/views/decorators/cache.py	(revision 775)
+++ django/views/decorators/cache.py	(working copy)
@@ -1,6 +1,7 @@
 from django.core.cache import cache
 from django.utils.httpwrappers import HttpResponseNotModified
 from django.utils.text import compress_string
+from django.conf import settings
 import datetime, md5
 
 def cache_page(view_func, cache_timeout, key_prefix=''):
@@ -25,7 +26,7 @@
         response = cache.get(cache_key, None)
         if response is None:
             response = view_func(request, *args, **kwargs)
-            content = response.get_content_as_string('utf-8')
+            content = response.get_content_as_string(settings.DEFAULT_CHARSET)
             if accepts_gzip:
                 content = compress_string(content)
                 response.content = content
