]> granicus.if.org Git - python/commitdiff
Change normalize_encodings() to avoid using .translate() or depending on
authorGuido van Rossum <guido@python.org>
Thu, 7 Jun 2007 21:43:46 +0000 (21:43 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 7 Jun 2007 21:43:46 +0000 (21:43 +0000)
the string type.  It will always return a Unicode string.  The algoritm's
specification is unchanged.

Lib/encodings/__init__.py

index 90ff47990ac0e43fa738aaaa9c1c212268066dc9..221ba8243bcfb3d188e6d113a94311853fc2c33a 100644 (file)
@@ -34,12 +34,6 @@ from . import aliases
 _cache = {}
 _unknown = '--unknown--'
 _import_tail = ['*']
-_norm_encoding_map = ('                                              . '
-                      '0123456789       ABCDEFGHIJKLMNOPQRSTUVWXYZ     '
-                      ' abcdefghijklmnopqrstuvwxyz                     '
-                      '                                                '
-                      '                                                '
-                      '                ')
 _aliases = aliases.aliases
 
 class CodecRegistryError(LookupError, SystemError):
@@ -58,14 +52,17 @@ def normalize_encoding(encoding):
         non-ASCII characters, these must be Latin-1 compatible.
 
     """
-    # Make sure we have an 8-bit string, because .translate() works
-    # differently for Unicode strings.
-    if isinstance(encoding, str):
-        # Note that .encode('latin-1') does *not* use the codec
-        # registry, so this call doesn't recurse. (See unicodeobject.c
-        # PyUnicode_AsEncodedString() for details)
-        encoding = encoding.encode('latin-1')
-    return '_'.join(encoding.translate(_norm_encoding_map).split())
+    chars = []
+    punct = False
+    for c in encoding:
+        if c.isalnum() or c == '.':
+            if punct and chars:
+                chars.append('_')
+            chars.append(c)
+            punct = False
+        else:
+            punct = True
+    return ''.join(chars)
 
 def search_function(encoding):