]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-132121: Always escape non-printable characters in pygettext (GH-132122)
authorTomas R. <tomas.roun8@gmail.com>
Sun, 6 Apr 2025 20:15:17 +0000 (22:15 +0200)
committerGitHub <noreply@github.com>
Sun, 6 Apr 2025 20:15:17 +0000 (23:15 +0300)
Lib/test/test_tools/i18n_data/ascii-escapes.pot
Misc/NEWS.d/next/Tools-Demos/2025-04-05-14-52-36.gh-issue-132121.QNoDih.rst [new file with mode: 0644]
Tools/i18n/pygettext.py

index f8e0f53b2569341f884228d0d47c0a5330fbfe83..cc5a9f6ba619db86a9a3f89befae6a11c9b056c0 100644 (file)
@@ -41,7 +41,7 @@ msgstr ""
 
 #. some characters in the 128-255 range
 #: escapes.py:20
-msgid "\80   ÿ"
+msgid "\302\200 \302\240 ÿ"
 msgstr ""
 
 #. some characters >= 256 encoded as 2, 3 and 4 bytes, respectively
diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-04-05-14-52-36.gh-issue-132121.QNoDih.rst b/Misc/NEWS.d/next/Tools-Demos/2025-04-05-14-52-36.gh-issue-132121.QNoDih.rst
new file mode 100644 (file)
index 0000000..1235360
--- /dev/null
@@ -0,0 +1 @@
+Always escape non-printable Unicode characters in :program:`pygettext`.
index f0ee2ea386f18fa0c1a8538cb8c6bdda6023a8a7..a4af1d2be829144ee08b7e3c872678172cdca715 100755 (executable)
@@ -190,12 +190,10 @@ def make_escapes(pass_nonascii):
         # Allow non-ascii characters to pass through so that e.g. 'msgid
         # "Höhe"' would not result in 'msgid "H\366he"'.  Otherwise we
         # escape any character outside the 32..126 range.
-        mod = 128
         escape = escape_ascii
     else:
-        mod = 256
         escape = escape_nonascii
-    escapes = [r"\%03o" % i for i in range(mod)]
+    escapes = [r"\%03o" % i for i in range(256)]
     for i in range(32, 127):
         escapes[i] = chr(i)
     escapes[ord('\\')] = r'\\'
@@ -206,7 +204,9 @@ def make_escapes(pass_nonascii):
 
 
 def escape_ascii(s, encoding):
-    return ''.join(escapes[ord(c)] if ord(c) < 128 else c for c in s)
+    return ''.join(escapes[ord(c)] if ord(c) < 128 else c
+                   if c.isprintable() else escape_nonascii(c, encoding)
+                   for c in s)
 
 
 def escape_nonascii(s, encoding):