diff --git a/django/contrib/gis/utils/layermapping.py b/django/contrib/gis/utils/layermapping.py
index 91537ba3ac..b7372f47b3 100644
--- a/django/contrib/gis/utils/layermapping.py
+++ b/django/contrib/gis/utils/layermapping.py
@@ -594,7 +594,7 @@ class LayerMapping:
 
                 # Printing progress information, if requested.
                 if progress and num_feat % progress_interval == 0:
-                    stream.write('Processed %d features, saved %d …\n' % (num_feat, num_saved))
+                    stream.write('Processed %d features, saved %d ...\n' % (num_feat, num_saved))
 
             # Only used for status output purposes -- incremental saving uses the
             # values returned here.
diff --git a/django/core/management/commands/loaddata.py b/django/core/management/commands/loaddata.py
index 40d75b58e4..5559225a80 100644
--- a/django/core/management/commands/loaddata.py
+++ b/django/core/management/commands/loaddata.py
@@ -226,7 +226,7 @@ class Command(BaseCommand):
         ser_fmts = serializers.get_public_serializer_formats() if ser_fmt is None else [ser_fmt]
 
         if self.verbosity >= 2:
-            self.stdout.write("Loading '%s' fixtures…" % fixture_name)
+            self.stdout.write("Loading '%s' fixtures..." % fixture_name)
 
         if os.path.isabs(fixture_name):
             fixture_dirs = [os.path.dirname(fixture_name)]
@@ -247,7 +247,7 @@ class Command(BaseCommand):
         fixture_files = []
         for fixture_dir in fixture_dirs:
             if self.verbosity >= 2:
-                self.stdout.write("Checking %s for fixtures…" % humanize(fixture_dir))
+                self.stdout.write("Checking %s for fixtures..." % humanize(fixture_dir))
             fixture_files_in_dir = []
             path = os.path.join(fixture_dir, fixture_name)
             for candidate in glob.iglob(glob.escape(path) + '*'):
diff --git a/django/core/management/commands/migrate.py b/django/core/management/commands/migrate.py
index c2d0c16816..4914da6803 100644
--- a/django/core/management/commands/migrate.py
+++ b/django/core/management/commands/migrate.py
@@ -263,7 +263,7 @@ class Command(BaseCommand):
             if action == "apply_start":
                 if compute_time:
                     self.start = time.time()
-                self.stdout.write("  Applying %s…" % migration, ending="")
+                self.stdout.write("  Applying %s..." % migration, ending="")
                 self.stdout.flush()
             elif action == "apply_success":
                 elapsed = " (%.3fs)" % (time.time() - self.start) if compute_time else ""
@@ -274,7 +274,7 @@ class Command(BaseCommand):
             elif action == "unapply_start":
                 if compute_time:
                     self.start = time.time()
-                self.stdout.write("  Unapplying %s…" % migration, ending="")
+                self.stdout.write("  Unapplying %s..." % migration, ending="")
                 self.stdout.flush()
             elif action == "unapply_success":
                 elapsed = " (%.3fs)" % (time.time() - self.start) if compute_time else ""
@@ -285,7 +285,7 @@ class Command(BaseCommand):
             elif action == "render_start":
                 if compute_time:
                     self.start = time.time()
-                self.stdout.write("  Rendering model states…", ending="")
+                self.stdout.write("  Rendering model states...", ending="")
                 self.stdout.flush()
             elif action == "render_success":
                 elapsed = " (%.3fs)" % (time.time() - self.start) if compute_time else ""
@@ -321,7 +321,7 @@ class Command(BaseCommand):
 
         # Create the tables for each model
         if self.verbosity >= 1:
-            self.stdout.write("  Creating tables…\n")
+            self.stdout.write("  Creating tables...\n")
         with connection.schema_editor() as editor:
             for app_name, model_list in manifest.items():
                 for model in model_list:
@@ -338,7 +338,7 @@ class Command(BaseCommand):
 
             # Deferred SQL is executed when exiting the editor's context.
             if self.verbosity >= 1:
-                self.stdout.write("    Running deferred SQL…\n")
+                self.stdout.write("    Running deferred SQL...\n")
 
     @staticmethod
     def describe_operation(operation, backwards):
diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py
index 862da12c64..90c8f9161c 100644
--- a/django/core/management/commands/runserver.py
+++ b/django/core/management/commands/runserver.py
@@ -113,7 +113,7 @@ class Command(BaseCommand):
         shutdown_message = options.get('shutdown_message', '')
         quit_command = 'CTRL-BREAK' if sys.platform == 'win32' else 'CONTROL-C'
 
-        self.stdout.write("Performing system checks…\n\n")
+        self.stdout.write("Performing system checks...\n\n")
         self.check(display_num_errors=True)
         # Need to check migrations here, so can't use the
         # requires_migrations_check attribute.
diff --git a/django/core/management/commands/showmigrations.py b/django/core/management/commands/showmigrations.py
index 4c86ba1a17..0722af7362 100644
--- a/django/core/management/commands/showmigrations.py
+++ b/django/core/management/commands/showmigrations.py
@@ -124,7 +124,7 @@ class Command(BaseCommand):
             for parent in sorted(node.parents):
                 out.append("%s.%s" % parent.key)
             if out:
-                return " … (%s)" % ", ".join(out)
+                return " ... (%s)" % ", ".join(out)
             return ""
 
         for node in plan:
diff --git a/django/core/management/commands/squashmigrations.py b/django/core/management/commands/squashmigrations.py
index 4a0ab6af83..9baf91c484 100644
--- a/django/core/management/commands/squashmigrations.py
+++ b/django/core/management/commands/squashmigrations.py
@@ -139,7 +139,7 @@ class Command(BaseCommand):
             new_operations = operations
         else:
             if self.verbosity > 0:
-                self.stdout.write(self.style.MIGRATE_HEADING("Optimizing…"))
+                self.stdout.write(self.style.MIGRATE_HEADING("Optimizing..."))
 
             optimizer = MigrationOptimizer()
             new_operations = optimizer.optimize(operations, migration.app_label)
diff --git a/django/db/backends/base/creation.py b/django/db/backends/base/creation.py
index 5c55efeded..f36d60a5fe 100644
--- a/django/db/backends/base/creation.py
+++ b/django/db/backends/base/creation.py
@@ -45,7 +45,7 @@ class BaseDatabaseCreation:
             if keepdb:
                 action = "Using existing"
 
-            self.log('%s test database for alias %s…' % (
+            self.log('%s test database for alias %s...' % (
                 action,
                 self._get_database_display_str(verbosity, test_database_name),
             ))
@@ -182,7 +182,7 @@ class BaseDatabaseCreation:
                 if autoclobber or confirm == 'yes':
                     try:
                         if verbosity >= 1:
-                            self.log('Destroying old test database for alias %s…' % (
+                            self.log('Destroying old test database for alias %s...' % (
                                 self._get_database_display_str(verbosity, test_database_name),
                             ))
                         cursor.execute('DROP DATABASE %(dbname)s' % test_db_params)
@@ -206,7 +206,7 @@ class BaseDatabaseCreation:
             action = 'Cloning test database'
             if keepdb:
                 action = 'Using existing clone'
-            self.log('%s for alias %s…' % (
+            self.log('%s for alias %s...' % (
                 action,
                 self._get_database_display_str(verbosity, source_database_name),
             ))
@@ -248,7 +248,7 @@ class BaseDatabaseCreation:
             action = 'Destroying'
             if keepdb:
                 action = 'Preserving'
-            self.log('%s test database for alias %s…' % (
+            self.log('%s test database for alias %s...' % (
                 action,
                 self._get_database_display_str(verbosity, test_database_name),
             ))
diff --git a/django/db/backends/mysql/creation.py b/django/db/backends/mysql/creation.py
index 8ccd211b0e..0e5bfca7b9 100644
--- a/django/db/backends/mysql/creation.py
+++ b/django/db/backends/mysql/creation.py
@@ -44,7 +44,7 @@ class DatabaseCreation(BaseDatabaseCreation):
                     return
                 try:
                     if verbosity >= 1:
-                        self.log('Destroying old test database for alias %s…' % (
+                        self.log('Destroying old test database for alias %s...' % (
                             self._get_database_display_str(verbosity, target_database_name),
                         ))
                     cursor.execute('DROP DATABASE %(dbname)s' % test_db_params)
diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py
index 741a03ae0e..2f4abfbc99 100644
--- a/django/db/backends/oracle/creation.py
+++ b/django/db/backends/oracle/creation.py
@@ -44,7 +44,7 @@ class DatabaseCreation(BaseDatabaseCreation):
                             "Type 'yes' to delete it, or 'no' to cancel: " % parameters['user'])
                     if autoclobber or confirm == 'yes':
                         if verbosity >= 1:
-                            self.log("Destroying old test database for alias '%s'…" % self.connection.alias)
+                            self.log("Destroying old test database for alias '%s'..." % self.connection.alias)
                         try:
                             self._execute_test_db_destruction(cursor, parameters, verbosity)
                         except DatabaseError as e:
@@ -69,7 +69,7 @@ class DatabaseCreation(BaseDatabaseCreation):
 
             if self._test_user_create():
                 if verbosity >= 1:
-                    self.log('Creating test user…')
+                    self.log('Creating test user...')
                 try:
                     self._create_test_user(cursor, parameters, verbosity, keepdb)
                 except Exception as e:
@@ -84,10 +84,10 @@ class DatabaseCreation(BaseDatabaseCreation):
                     if autoclobber or confirm == 'yes':
                         try:
                             if verbosity >= 1:
-                                self.log('Destroying old test user…')
+                                self.log('Destroying old test user...')
                             self._destroy_test_user(cursor, parameters, verbosity)
                             if verbosity >= 1:
-                                self.log('Creating test user…')
+                                self.log('Creating test user...')
                             self._create_test_user(cursor, parameters, verbosity, keepdb)
                         except Exception as e:
                             self.log('Got an error recreating the test user: %s' % e)
@@ -143,14 +143,14 @@ class DatabaseCreation(BaseDatabaseCreation):
             if autoclobber or confirm == 'yes':
                 try:
                     if verbosity >= 1:
-                        self.log('Destroying old test user…')
+                        self.log('Destroying old test user...')
                     self._destroy_test_user(cursor, parameters, verbosity)
                 except Exception as e:
                     self.log('Got an error destroying the test user: %s' % e)
                     sys.exit(2)
                 try:
                     if verbosity >= 1:
-                        self.log("Destroying old test database for alias '%s'…" % self.connection.alias)
+                        self.log("Destroying old test database for alias '%s'..." % self.connection.alias)
                     self._execute_test_db_destruction(cursor, parameters, verbosity)
                 except Exception as e:
                     self.log('Got an error destroying the test database: %s' % e)
@@ -176,11 +176,11 @@ class DatabaseCreation(BaseDatabaseCreation):
         with self._maindb_connection.cursor() as cursor:
             if self._test_user_create():
                 if verbosity >= 1:
-                    self.log('Destroying test user…')
+                    self.log('Destroying test user...')
                 self._destroy_test_user(cursor, parameters, verbosity)
             if self._test_database_create():
                 if verbosity >= 1:
-                    self.log('Destroying test database tables…')
+                    self.log('Destroying test database tables...')
                 self._execute_test_db_destruction(cursor, parameters, verbosity)
         self._maindb_connection.close()
 
@@ -262,7 +262,7 @@ class DatabaseCreation(BaseDatabaseCreation):
     def _destroy_test_user(self, cursor, parameters, verbosity):
         if verbosity >= 2:
             self.log('_destroy_test_user(): user=%s' % parameters['user'])
-            self.log('Be patient. This can take some time…')
+            self.log('Be patient. This can take some time...')
         statements = [
             'DROP USER %(user)s CASCADE',
         ]
diff --git a/django/db/backends/postgresql/creation.py b/django/db/backends/postgresql/creation.py
index b37766b834..09af818b1e 100644
--- a/django/db/backends/postgresql/creation.py
+++ b/django/db/backends/postgresql/creation.py
@@ -67,7 +67,7 @@ class DatabaseCreation(BaseDatabaseCreation):
             except Exception:
                 try:
                     if verbosity >= 1:
-                        self.log('Destroying old test database for alias %s…' % (
+                        self.log('Destroying old test database for alias %s...' % (
                             self._get_database_display_str(verbosity, target_database_name),
                         ))
                     cursor.execute('DROP DATABASE %(dbname)s' % test_db_params)
diff --git a/django/db/backends/sqlite3/creation.py b/django/db/backends/sqlite3/creation.py
index d22d8358a7..3fcf668ced 100644
--- a/django/db/backends/sqlite3/creation.py
+++ b/django/db/backends/sqlite3/creation.py
@@ -25,7 +25,7 @@ class DatabaseCreation(BaseDatabaseCreation):
         if not self.is_in_memory_db(test_database_name):
             # Erase the old test database
             if verbosity >= 1:
-                self.log('Destroying old test database for alias %s…' % (
+                self.log('Destroying old test database for alias %s...' % (
                     self._get_database_display_str(verbosity, test_database_name),
                 ))
             if os.access(test_database_name, os.F_OK):
@@ -64,7 +64,7 @@ class DatabaseCreation(BaseDatabaseCreation):
                 if keepdb:
                     return
                 if verbosity >= 1:
-                    self.log('Destroying old test database for alias %s…' % (
+                    self.log('Destroying old test database for alias %s...' % (
                         self._get_database_display_str(verbosity, target_database_name),
                     ))
                 try:
diff --git a/django/db/models/query.py b/django/db/models/query.py
index f92998e7ad..ffd8626f4b 100644
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ -249,7 +249,7 @@ class QuerySet:
     def __repr__(self):
         data = list(self[:REPR_OUTPUT_SIZE + 1])
         if len(data) > REPR_OUTPUT_SIZE:
-            data[-1] = "…(remaining elements truncated)…"
+            data[-1] = "...(remaining elements truncated)..."
         return '<%s %r>' % (self.__class__.__name__, data)
 
     def __len__(self):
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 675ff8c176..ffa8db86f2 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -614,7 +614,7 @@ class Query:
             # really make sense (or return consistent value sets). Not worth
             # the extra complexity when you can write a real query instead.
             if self._extra and rhs._extra:
-                raise ValueError("When merging querysets using 'or', you cannot have extra(select=…) on both sides.")
+                raise ValueError("When merging querysets using 'or', you cannot have extra(select=...) on both sides.")
         self.extra.update(rhs.extra)
         extra_select_mask = set()
         if self.extra_select_mask is not None:
diff --git a/docs/intro/tutorial01.txt b/docs/intro/tutorial01.txt
index 208a4f3a3b..56de527fac 100644
--- a/docs/intro/tutorial01.txt
+++ b/docs/intro/tutorial01.txt
@@ -131,7 +131,7 @@ You'll see the following output on the command line:
 
 .. parsed-literal::
 
-    Performing system checks…
+    Performing system checks...
 
     System check identified no issues (0 silenced).
 
diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt
index 4d2a62bec2..9046d167b0 100644
--- a/docs/intro/tutorial02.txt
+++ b/docs/intro/tutorial02.txt
@@ -338,8 +338,8 @@ Now, run :djadmin:`migrate` again to create those model tables in your database:
     Operations to perform:
       Apply all migrations: admin, auth, contenttypes, polls, sessions
     Running migrations:
-      Rendering model states… DONE
-      Applying polls.0001_initial… OK
+      Rendering model states... DONE
+      Applying polls.0001_initial... OK
 
 The :djadmin:`migrate` command takes all the migrations that haven't been
 applied (Django tracks which ones are applied using a special table in your
diff --git a/docs/intro/tutorial05.txt b/docs/intro/tutorial05.txt
index 222bbf4972..42891a6ecd 100644
--- a/docs/intro/tutorial05.txt
+++ b/docs/intro/tutorial05.txt
@@ -203,7 +203,7 @@ In the terminal, we can run our test:
 
 and you'll see something like::
 
-    Creating test database for alias 'default'…
+    Creating test database for alias 'default'...
     System check identified no issues (0 silenced).
     F
     ======================================================================
@@ -218,7 +218,7 @@ and you'll see something like::
     Ran 1 test in 0.001s
 
     FAILED (failures=1)
-    Destroying test database for alias 'default'…
+    Destroying test database for alias 'default'...
 
 What happened is this:
 
@@ -257,14 +257,14 @@ past:
 
 and run the test again::
 
-    Creating test database for alias 'default'…
+    Creating test database for alias 'default'...
     System check identified no issues (0 silenced).
     .
     ----------------------------------------------------------------------
     Ran 1 test in 0.001s
 
     OK
-    Destroying test database for alias 'default'…
+    Destroying test database for alias 'default'...
 
 After identifying a bug, we wrote a test that exposes it and corrected the bug
 in the code so our test passes.
diff --git a/docs/topics/migrations.txt b/docs/topics/migrations.txt
index 4df05bdd67..f518341310 100644
--- a/docs/topics/migrations.txt
+++ b/docs/topics/migrations.txt
@@ -135,8 +135,8 @@ database to make sure they work as expected::
     Operations to perform:
       Apply all migrations: books
     Running migrations:
-      Rendering model states… DONE
-      Applying books.0003_auto… OK
+      Rendering model states... DONE
+      Applying books.0003_auto... OK
 
 Once the migration is applied, commit the migration and the models change
 to your version control system as a single commit - that way, when other
diff --git a/docs/topics/testing/overview.txt b/docs/topics/testing/overview.txt
index a0aab28d15..12efb381c7 100644
--- a/docs/topics/testing/overview.txt
+++ b/docs/topics/testing/overview.txt
@@ -279,7 +279,7 @@ When you run your tests, you'll see a number of messages as the test runner
 prepares itself. You can control the level of detail of these messages with the
 ``verbosity`` option on the command line::
 
-    Creating test database…
+    Creating test database...
     Creating table myapp_animal
     Creating table myapp_mineral
 
diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py
index 972983536e..36e8f2f5ea 100644
--- a/tests/migrations/test_commands.py
+++ b/tests/migrations/test_commands.py
@@ -41,7 +41,7 @@ class MigrateTests(MigrationTestBase):
         call_command('migrate', 'migrations', '0001', verbosity=1, stdout=stdout, no_color=True)
         stdout = stdout.getvalue()
         self.assertIn('Target specific migration: 0001_initial, from migrations', stdout)
-        self.assertIn('Applying migrations.0001_initial… OK', stdout)
+        self.assertIn('Applying migrations.0001_initial... OK', stdout)
         # The correct tables exist
         self.assertTableExists("migrations_author")
         self.assertTableExists("migrations_tribble")
@@ -57,7 +57,7 @@ class MigrateTests(MigrationTestBase):
         call_command('migrate', 'migrations', 'zero', verbosity=1, stdout=stdout, no_color=True)
         stdout = stdout.getvalue()
         self.assertIn('Unapply all migrations: migrations', stdout)
-        self.assertIn('Unapplying migrations.0002_second… OK', stdout)
+        self.assertIn('Unapplying migrations.0002_second... OK', stdout)
         # Tables are gone
         self.assertTableNotExists("migrations_author")
         self.assertTableNotExists("migrations_tribble")
@@ -157,7 +157,7 @@ class MigrateTests(MigrationTestBase):
             call_command("migrate", "migrations", "0001", fake_initial=True, stdout=out, verbosity=1)
             call_command("migrate", "migrations", "0001", fake_initial=True, verbosity=0, database="other")
         self.assertIn(
-            "migrations.0001_initial… faked",
+            "migrations.0001_initial... faked",
             out.getvalue().lower()
         )
         # Run migrations all the way
@@ -208,8 +208,8 @@ class MigrateTests(MigrationTestBase):
         with mock.patch('django.core.management.color.supports_color', lambda *args: False):
             call_command("migrate", "migrations", "0002", fake_initial=True, stdout=out, verbosity=1)
         value = out.getvalue().lower()
-        self.assertIn("migrations.0001_initial… faked", value)
-        self.assertIn("migrations.0002_second… faked", value)
+        self.assertIn("migrations.0001_initial... faked", value)
+        self.assertIn("migrations.0002_second... faked", value)
         # Fake an apply
         call_command("migrate", "migrations", fake=True, verbosity=0)
         # Unmigrate everything
@@ -271,8 +271,8 @@ class MigrateTests(MigrationTestBase):
         call_command("showmigrations", format='plan', stdout=out, verbosity=2)
         self.assertEqual(
             "[ ]  migrations.0001_initial\n"
-            "[ ]  migrations.0003_third … (migrations.0001_initial)\n"
-            "[ ]  migrations.0002_second … (migrations.0001_initial, migrations.0003_third)\n",
+            "[ ]  migrations.0003_third ... (migrations.0001_initial)\n"
+            "[ ]  migrations.0002_second ... (migrations.0001_initial, migrations.0003_third)\n",
             out.getvalue().lower()
         )
         call_command("migrate", "migrations", "0003", verbosity=0)
@@ -290,8 +290,8 @@ class MigrateTests(MigrationTestBase):
         call_command("showmigrations", format='plan', stdout=out, verbosity=2)
         self.assertEqual(
             "[x]  migrations.0001_initial\n"
-            "[x]  migrations.0003_third … (migrations.0001_initial)\n"
-            "[ ]  migrations.0002_second … (migrations.0001_initial, migrations.0003_third)\n",
+            "[x]  migrations.0003_third ... (migrations.0001_initial)\n"
+            "[ ]  migrations.0002_second ... (migrations.0001_initial, migrations.0003_third)\n",
             out.getvalue().lower()
         )
 
@@ -410,10 +410,10 @@ class MigrateTests(MigrationTestBase):
         call_command("showmigrations", format='plan', stdout=out, verbosity=2)
         self.assertEqual(
             "[ ]  migrations.1_auto\n"
-            "[ ]  migrations.2_auto … (migrations.1_auto)\n"
-            "[ ]  migrations.3_squashed_5 … (migrations.2_auto)\n"
-            "[ ]  migrations.6_auto … (migrations.3_squashed_5)\n"
-            "[ ]  migrations.7_auto … (migrations.6_auto)\n",
+            "[ ]  migrations.2_auto ... (migrations.1_auto)\n"
+            "[ ]  migrations.3_squashed_5 ... (migrations.2_auto)\n"
+            "[ ]  migrations.6_auto ... (migrations.3_squashed_5)\n"
+            "[ ]  migrations.7_auto ... (migrations.6_auto)\n",
             out.getvalue().lower()
         )
 
@@ -434,10 +434,10 @@ class MigrateTests(MigrationTestBase):
         call_command("showmigrations", format='plan', stdout=out, verbosity=2)
         self.assertEqual(
             "[x]  migrations.1_auto\n"
-            "[x]  migrations.2_auto … (migrations.1_auto)\n"
-            "[x]  migrations.3_squashed_5 … (migrations.2_auto)\n"
-            "[ ]  migrations.6_auto … (migrations.3_squashed_5)\n"
-            "[ ]  migrations.7_auto … (migrations.6_auto)\n",
+            "[x]  migrations.2_auto ... (migrations.1_auto)\n"
+            "[x]  migrations.3_squashed_5 ... (migrations.2_auto)\n"
+            "[ ]  migrations.6_auto ... (migrations.3_squashed_5)\n"
+            "[ ]  migrations.7_auto ... (migrations.6_auto)\n",
             out.getvalue().lower()
         )
 
@@ -659,7 +659,7 @@ class MigrateTests(MigrationTestBase):
             self.assertGreater(len(execute.mock_calls), 2)
         stdout = stdout.getvalue()
         self.assertIn('Synchronize unmigrated apps: unmigrated_app_syncdb', stdout)
-        self.assertIn('Creating tables…', stdout)
+        self.assertIn('Creating tables...', stdout)
         table_name = truncate_name('unmigrated_app_syncdb_classroom', connection.ops.max_name_length())
         self.assertIn('Creating table %s' % table_name, stdout)