Index: django/db/models/fields/__init__.py
===================================================================
--- django/db/models/fields/__init__.py	(revision 12454)
+++ django/db/models/fields/__init__.py	(working copy)
@@ -377,7 +377,7 @@
             return force_unicode(self.default, strings_only=True)
         if not self.empty_strings_allowed or (self.null and not connection.features.interprets_empty_strings_as_nulls):
             return None
-        return ""
+        return u""
 
     def get_validator_unique_lookup_type(self):
         return '%s__exact' % self.name
@@ -565,7 +565,7 @@
         return "CharField"
 
     def to_python(self, value):
-        if isinstance(value, basestring) or value is None:
+        if isinstance(value, unicode) or value is None:
             return value
         return smart_unicode(value)
 
Index: tests/regressiontests/model_fields/tests.py
===================================================================
--- tests/regressiontests/model_fields/tests.py	(revision 12454)
+++ tests/regressiontests/model_fields/tests.py	(working copy)
@@ -126,6 +126,30 @@
         f = models.BooleanField(choices=choices, default=1, null=False)
         self.assertEqual(f.formfield().choices, choices)
 
+class CharFieldTests(django.test.TestCase):
+    def test_to_python(self):
+        f = models.CharField()
+        self.assertEqual(f.to_python(u"test"), u"test")
+        self.assertEqual(type(f.to_python(u"test")), unicode)
+
+    def test_to_python_extended(self):
+        f = models.CharField()
+        self.assertEqual(f.to_python(u"ni\u223ca"), u"ni\u223ca")
+        
+    def test_default(self):
+        empty_f = models.CharField()
+        self.assertEqual(empty_f.to_python(""), u"")
+        self.assertEqual(type(empty_f.get_default()), unicode)
+
+        str_f = models.CharField(default="my_default")
+        self.assertEqual(str_f.get_default(), u"my_default")
+        self.assertEqual(type(str_f.get_default()), unicode)
+        
+        uni_f = models.CharField(default=u"my_default")
+        self.assertEqual(uni_f.get_default(), u"my_default")
+        self.assertEqual(type(uni_f.get_default()), unicode)
+
+
 class ChoicesTests(django.test.TestCase):
     def test_choices_and_field_display(self):
         """
