diff --git a/mo/jobs/submit.py b/mo/jobs/submit.py
index 1a5c7560fecd0ee07e1575a26bf9e119847e908d..8a8f6b4b42a7a3a0f8e335b6c32a1faa51e6c9bc 100644
--- a/mo/jobs/submit.py
+++ b/mo/jobs/submit.py
@@ -76,7 +76,7 @@ def handle_download_submits(the_job: TheJob):
             cnt += 1
             full_name = u.full_name()
             ascii_name = (unicodedata.normalize('NFD', full_name)
-                          .encode('ascii', 'ignore')
+                          .encode('ascii', errors='ignore')
                           .decode('utf-8'))
             fn = f'{task_code}_{cnt:04d}_{u.user_id}_{p.paper_id}_{ascii_name}.pdf'
             fn = werkzeug.utils.secure_filename(fn)
diff --git a/mo/web/imports.py b/mo/web/imports.py
index a9c19e040d2e819310ae20361ae0480b7cb4d324..b5cf4366746d1ef77e31c74c2eff5d08b1d1c637 100644
--- a/mo/web/imports.py
+++ b/mo/web/imports.py
@@ -48,7 +48,7 @@ def generic_import_page(form: ImportForm, imp: Optional[Import], redirect_url: s
                 flash('Vyberte si prosím soubor', 'danger')
         elif form.get_template.data:
             out = imp.get_template()
-            resp = app.make_response(out.encode(fmt.get_charset()))
+            resp = app.make_response(out.encode(fmt.get_charset(), errors='replace'))
             resp.content_type = fmt.get_content_type()
             resp.headers.add('Content-Disposition', 'attachment; filename=OSMO-' + imp.template_basename + '.' + fmt.get_extension())
             return resp
diff --git a/mo/web/table.py b/mo/web/table.py
index 2d69af23a02d253e62f5d349cb50073dd4c702ba..a18bd2c6cf51134547dc19c697d7afb658c663f9 100644
--- a/mo/web/table.py
+++ b/mo/web/table.py
@@ -239,7 +239,7 @@ class Table:
             r = [row.get(c.key) for c in export_columns]
             writer.writerow(r)
 
-        return out.getvalue().encode(fmt.get_charset())
+        return out.getvalue().encode(fmt.get_charset(), errors='replace')
 
     def to_csv_stream(self, fmt: FileFormat, export_columns: List[Column]) -> Iterable[bytes]:
         out = io.StringIO()
@@ -252,12 +252,12 @@ class Table:
 
             nrows += 1
             if nrows >= 100:
-                yield out.getvalue().encode(fmt.get_charset())
+                yield out.getvalue().encode(fmt.get_charset(), errors='replace')
                 out.seek(0)
                 out.truncate()
                 nrows = 0
 
-        yield out.getvalue().encode(fmt.get_charset())
+        yield out.getvalue().encode(fmt.get_charset(), errors='replace')
 
     def send_as(self, format: Union[FileFormat, str], streaming: bool = False, args: Union[None, MultiDict, ImmutableMultiDict] = None) -> Response:
         try:
diff --git a/mo/web/util.py b/mo/web/util.py
index 5e3d56eb009d68bff641ffd57a416f350eb18c1b..19c2bf61700d73b442e1104caeee1b254dd97e13 100644
--- a/mo/web/util.py
+++ b/mo/web/util.py
@@ -76,7 +76,7 @@ def _task_paper_filename(user: db.User, paper: db.Paper) -> str:
 
     full_name = user.full_name()
     ascii_name = (unicodedata.normalize('NFD', full_name)
-                  .encode('ascii', 'ignore')
+                  .encode('ascii', errors='ignore')
                   .decode('utf-8'))
 
     if paper.type == db.PaperType.solution: