diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index cd1ac1debe..6e7ef9b742 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -107,6 +107,7 @@ class DjangoTranslation(gettext_module.GNUTranslations):
     def __init__(self, language):
         """Create a GNUTranslations() using many locale directories"""
         gettext_module.GNUTranslations.__init__(self)
+        self.set_output_charset('utf-8')  # For Python 2 gettext() (#25720)
 
         self.__language = language
         self.__to_language = to_language(language)
diff --git a/docs/releases/1.8.7.txt b/docs/releases/1.8.7.txt
index cf548ee74d..ec9f310ad9 100644
--- a/docs/releases/1.8.7.txt
+++ b/docs/releases/1.8.7.txt
@@ -27,3 +27,6 @@ Bugfixes
 
 * Fixed a data loss possibility with :class:`~django.db.models.Prefetch` if
   ``to_attr`` is set to a ``ManyToManyField`` (:ticket:`25693`).
+
+* Fixed a regression in 1.8 by making ``gettext()`` once again return UTF-8
+  bytestrings on Python 2 if the input is a bytestring (:ticket:`25720`).
diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py
index 58ef0c74a8..788a6dec89 100644
--- a/tests/i18n/tests.py
+++ b/tests/i18n/tests.py
@@ -141,6 +141,18 @@ class TranslationTests(TestCase):
         s4 = ugettext_lazy('Some other string')
         self.assertNotEqual(s, s4)
 
+    @skipUnless(six.PY2, "No more bytestring translations on PY3")
+    def test_bytestrings(self):
+        """gettext() returns a bytestring if input is bytestring."""
+
+        # Using repr() to check translated text and type
+        self.assertEqual(repr(gettext(b"Time")), repr(b"Time"))
+        self.assertEqual(repr(gettext("Time")), repr("Time"))
+
+        with translation.override('de', deactivate=True):
+            self.assertEqual(repr(gettext(b"Time")), repr(b"Zeit"))
+            self.assertEqual(repr(gettext("Time")), repr(b"Zeit"))
+
     @skipUnless(six.PY2, "No more bytestring translations on PY3")
     def test_lazy_and_bytestrings(self):
         # On Python 2, (n)gettext_lazy should not transform a bytestring to unicode