Add getpreferredencoding. Support @euro modifiers. Fixes #554676.
The @euro part is backported to 2.2.3.
This commit is contained in:
parent
cf57e50989
commit
f0a4668e6f
|
@ -155,6 +155,20 @@ for which symbolic constants are available in the locale module.
|
||||||
\versionadded{2.0}
|
\versionadded{2.0}
|
||||||
\end{funcdesc}
|
\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}
|
\begin{funcdesc}{normalize}{localename}
|
||||||
Returns a normalized locale code for the given locale name. The
|
Returns a normalized locale code for the given locale name. The
|
||||||
returned locale code is formatted for use with
|
returned locale code is formatted for use with
|
||||||
|
|
|
@ -264,6 +264,15 @@ def _parse_localename(localename):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
code = normalize(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:
|
if '.' in code:
|
||||||
return code.split('.')[:2]
|
return code.split('.')[:2]
|
||||||
elif code == 'C':
|
elif code == 'C':
|
||||||
|
@ -381,6 +390,38 @@ def resetlocale(category=LC_ALL):
|
||||||
"""
|
"""
|
||||||
_setlocale(category, _build_localename(getdefaultlocale()))
|
_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
|
### Database
|
||||||
#
|
#
|
||||||
# The following data was extracted from the locale.alias file which
|
# The following data was extracted from the locale.alias file which
|
||||||
|
|
|
@ -38,5 +38,7 @@ try:
|
||||||
testformat("%20.f", -42, grouping=1, output=' -42')
|
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')
|
||||||
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:
|
finally:
|
||||||
locale.setlocale(locale.LC_NUMERIC, oldlocale)
|
locale.setlocale(locale.LC_NUMERIC, oldlocale)
|
||||||
|
|
|
@ -325,7 +325,8 @@ Extension modules
|
||||||
- posix.lchown, posix.killpg, posix.mknod, and posix.getpgid have been
|
- posix.lchown, posix.killpg, posix.mknod, and posix.getpgid have been
|
||||||
added where available.
|
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
|
- A security hole ("double free") was found in zlib-1.1.3, a popular
|
||||||
third party compression library used by some Python modules. The
|
third party compression library used by some Python modules. The
|
||||||
|
|
Loading…
Reference in New Issue