]> granicus.if.org Git - python/commitdiff
Add getpreferredencoding. Support @euro modifiers. Fixes #554676.
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 3 Nov 2002 17:20:12 +0000 (17:20 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 3 Nov 2002 17:20:12 +0000 (17:20 +0000)
The @euro part is backported to 2.2.3.

Doc/lib/liblocale.tex
Lib/locale.py
Lib/test/test_locale.py
Misc/NEWS

index 3c4506d78210cd1999d36f4395a665945af5fda8..415f0cf197f15e4f685f19b1894fb0e9a2eb7c4a 100644 (file)
@@ -155,6 +155,20 @@ for which symbolic constants are available in the locale module.
   \versionadded{2.0}
 \end{funcdesc}
 
+\begin{funcdesc}{getpreferredencoding}{\optional{do_setlocale}}
+  Return the encoding used for text data, according to user
+  preferences.  User preferences are expressed differently on
+  different systems, and might not be available programmatically on
+  some systems, so this function only returns a guess.
+
+  On some systems, it is necessary to invoke \function{setlocale}
+  to obtain the user preferences, so this function is not thread-safe.
+  If invoking setlocale is not necessary or desired, \var{do_setlocale}
+  should be set to \code{False}.
+
+  \versionadded{2.3}
+\end{funcdesc}
+
 \begin{funcdesc}{normalize}{localename}
   Returns a normalized locale code for the given locale name.  The
   returned locale code is formatted for use with
index 9078eed9164a7de7b27e2a4b248de4b89b724c65..9ae981f9a13f213c8019017c06a27ad3a0ab6acb 100644 (file)
@@ -264,6 +264,15 @@ def _parse_localename(localename):
 
     """
     code = normalize(localename)
+    if '@' in localename:
+        # Deal with locale modifiers
+        code, modifier = code.split('@')
+        if modifier == 'euro' and '.' not in code:
+            # Assume Latin-9 for @euro locales. This is bogus,
+            # since some systems may use other encodings for these
+            # locales. Also, we ignore other modifiers.
+            return code, 'iso-8859-15'
+            
     if '.' in code:
         return code.split('.')[:2]
     elif code == 'C':
@@ -381,6 +390,38 @@ def resetlocale(category=LC_ALL):
     """
     _setlocale(category, _build_localename(getdefaultlocale()))
 
+if sys.platform in ('win32', 'darwin', 'mac'):
+    # On Win32, this will return the ANSI code page
+    # On the Mac, it should return the system encoding;
+    # it might return "ascii" instead
+    def getpreferredencoding(do_setlocale = True):
+        """Return the charset that the user is likely using."""
+        import _locale
+        return _locale.getdefaultlocale()[1]
+else:
+    # On Unix, if CODESET is available, use that.
+    try:
+        CODESET
+    except NameError:
+        # Fall back to parsing environment variables :-(
+        def getpreferredencoding(do_setlocale = True):
+            """Return the charset that the user is likely using,
+            by looking at environment variables."""
+            return getdefaultlocale()[1]
+    else:
+        def getpreferredencoding(do_setlocale = True):
+            """Return the charset that the user is likely using,
+            according to the system configuration."""
+            if do_setlocale:
+                oldloc = setlocale(LC_CTYPE)
+                setlocale(LC_CTYPE, "")
+                result = nl_langinfo(CODESET)
+                setlocale(LC_CTYPE, oldloc)
+                return result
+            else:
+                return nl_langinfo(CODESET)
+                
+
 ### Database
 #
 # The following data was extracted from the locale.alias file which
index 2e056cfe103f862052dc50df2d56b3a1bbfbc8bc..46cbee2b53d741554be4c0f08ae9b2862778ff94 100644 (file)
@@ -38,5 +38,7 @@ try:
     testformat("%20.f", -42, grouping=1, output='                 -42')
     testformat("%+10.f", -4200, grouping=1, output='    -4,200')
     testformat("%-10.f", 4200, grouping=1, output='4,200     ')
+    # Invoke getpreferredencoding to make sure it does not cause exceptions,
+    locale.getpreferredencoding()
 finally:
     locale.setlocale(locale.LC_NUMERIC, oldlocale)
index 3a026df54f2dddf271956cbb2cbdc7a07b1dc8d1..71eacc84d4cc6a7cb58d38c18bf203862834e364 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -325,7 +325,8 @@ Extension modules
 - posix.lchown, posix.killpg, posix.mknod, and posix.getpgid have been
   added where available.
 
-- The locale module now exposes the C library's gettext interface.
+- The locale module now exposes the C library's gettext interface. It
+  also has a new function getpreferredencoding.
 
 - A security hole ("double free") was found in zlib-1.1.3, a popular
   third party compression library used by some Python modules.  The