diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/locale.py | 41 | ||||
-rw-r--r-- | Lib/test/test_locale.py | 2 |
2 files changed, 43 insertions, 0 deletions
diff --git a/Lib/locale.py b/Lib/locale.py index 9078eed..9ae981f 100644 --- a/Lib/locale.py +++ b/Lib/locale.py @@ -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 diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py index 2e056cf..46cbee2 100644 --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -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) |