diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py
index 0d9a50148d..3d81f580fb 100644
--- a/django/conf/global_settings.py
+++ b/django/conf/global_settings.py
@@ -32,9 +32,11 @@ LANGUAGE_CODE = 'en-us'
# 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.
+DEFAULT_CONTENT_TYPE = 'text/html'
+DEFAULT_CHARSET = 'utf-8'
# E-mail address that error messages come from.
SERVER_EMAIL = 'root@localhost'
diff --git a/django/core/formfields.py b/django/core/formfields.py
index 7587b67170..76721ba5c6 100644
--- a/django/core/formfields.py
+++ b/django/core/formfields.py
@@ -1,6 +1,7 @@
from django.core import validators
from django.core.exceptions import PermissionDenied
from django.utils.html import escape
+from django.conf.settings import DEFAULT_CHARSET
FORM_FIELD_ID_PREFIX = 'id_'
@@ -221,7 +222,7 @@ class TextField(FormField):
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(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 @@ class TextField(FormField):
if self.maxlength:
maxlength = 'maxlength="%s" ' % self.maxlength
if isinstance(data, unicode):
- data = data.encode('utf-8')
+ data = data.encode(DEFAULT_CHARSET)
return '' % \
(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 @@ class LargeTextField(TextField):
if data is None:
data = ''
if isinstance(data, unicode):
- data = data.encode('utf-8')
+ data = data.encode(DEFAULT_CHARSET)
return '' % \
(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))
diff --git a/django/core/handlers/modpython.py b/django/core/handlers/modpython.py
index 623db959b2..e52879065f 100644
--- a/django/core/handlers/modpython.py
+++ b/django/core/handlers/modpython.py
@@ -150,14 +150,15 @@ class ModPythonHandler(BaseHandler):
def populate_apache_request(http_response, mod_python_req):
"Populates the mod_python request object with an HttpResponse"
- mod_python_req.content_type = http_response['Content-Type'] or httpwrappers.DEFAULT_MIME_TYPE
+ from django.conf import settings
+ mod_python_req.content_type = http_response['Content-Type']
for key, value in http_response.headers.items():
if key != 'Content-Type':
mod_python_req.headers_out[key] = value
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'))
+ mod_python_req.write(http_response.get_content_as_string(settings.DEFAULT_CHARSET))
def handler(req):
# mod_python hooks into this function.
diff --git a/django/core/handlers/wsgi.py b/django/core/handlers/wsgi.py
index 40ea9fb902..2d34c64821 100644
--- a/django/core/handlers/wsgi.py
+++ b/django/core/handlers/wsgi.py
@@ -167,6 +167,6 @@ class WSGIHandler(BaseHandler):
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
diff --git a/django/core/template.py b/django/core/template.py
index 35b557bbfb..71a8e621c8 100644
--- a/django/core/template.py
+++ b/django/core/template.py
@@ -55,6 +55,7 @@ times with multiple contexts)
'\n\n\n\n'
"""
import re
+from django.conf.settings import DEFAULT_CHARSET
__all__ = ('Template','Context','compile_string')
@@ -474,7 +475,7 @@ class VariableNode(Node):
if not isinstance(output, basestring):
output = str(output)
elif isinstance(output, unicode):
- output = output.encode('utf-8')
+ output = output.encode(DEFAULT_CHARSET)
return output
def register_tag(token_command, callback_function):
diff --git a/django/middleware/cache.py b/django/middleware/cache.py
index f3d03e657a..7f4057eec7 100644
--- a/django/middleware/cache.py
+++ b/django/middleware/cache.py
@@ -76,7 +76,7 @@ class CacheMiddleware:
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
diff --git a/django/middleware/common.py b/django/middleware/common.py
index 4abe4ee236..e794477b62 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -76,7 +76,7 @@ class CommonMiddleware:
# 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:
diff --git a/django/utils/httpwrappers.py b/django/utils/httpwrappers.py
index eeebda565d..5f9362bd24 100644
--- a/django/utils/httpwrappers.py
+++ b/django/utils/httpwrappers.py
@@ -1,7 +1,7 @@
from Cookie import SimpleCookie
from pprint import pformat
from urllib import urlencode
-import datastructures
+from django.utils import datastructures
class HttpRequest(object): # needs to be new-style class because subclasses define "property"s
"A basic HTTP request"
@@ -139,8 +139,8 @@ class HttpResponse:
"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 = "%s; charset=%s" % (DEFAULT_CONTENT_TYPE, DEFAULT_CHARSET)
self.content = content
self.headers = {'Content-Type':mimetype}
self.cookies = SimpleCookie()
diff --git a/django/views/decorators/cache.py b/django/views/decorators/cache.py
index 7c76ef272d..de80851363 100644
--- a/django/views/decorators/cache.py
+++ b/django/views/decorators/cache.py
@@ -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.settings import DEFAULT_CHARSET
import datetime, md5
def cache_page(view_func, cache_timeout, key_prefix=''):
@@ -25,7 +26,7 @@ def cache_page(view_func, cache_timeout, key_prefix=''):
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(DEFAULT_CHARSET)
if accepts_gzip:
content = compress_string(content)
response.content = content