Skip to content

locale.getlocale() fails if locale name doesn't include encoding #64287

Closed

Description

@serhiy-storchaka
BPO 20088
Nosy @malemburg, @loewis, @tjguk, @zware, @serhiy-storchaka, @eryksun, @zooba, @Kristinita

Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

Show more details

GitHub fields:

assignee = None
closed_at = None
created_at = <Date 2013-12-28.09:44:02.941>
labels = ['3.8', 'type-bug', 'library', '3.9', '3.10']
title = "locale.getlocale() fails if locale name doesn't include encoding"
updated_at = <Date 2021-03-04.15:21:05.592>
user = 'https://github.com/serhiy-storchaka'

bugs.python.org fields:

activity = <Date 2021-03-04.15:21:05.592>
actor = 'eryksun'
assignee = 'none'
closed = False
closed_date = None
closer = None
components = ['Library (Lib)']
creation = <Date 2013-12-28.09:44:02.941>
creator = 'serhiy.storchaka'
dependencies = []
files = []
hgrepos = []
issue_num = 20088
keywords = []
message_count = 4.0
messages = ['207026', '235823', '235840', '388095']
nosy_count = 9.0
nosy_names = ['lemburg', 'loewis', 'tim.golden', 'Arfrever', 'zach.ware', 'serhiy.storchaka', 'eryksun', 'steve.dower', 'nervov_fan']
pr_nums = []
priority = 'normal'
resolution = None
stage = None
status = 'open'
superseder = None
type = 'behavior'
url = 'https://bugs.python.org/issue20088'
versions = ['Python 3.8', 'Python 3.9', 'Python 3.10']

Activity

  1. serhiy-storchaka commented on Dec 28, 2013

    @serhiy-storchaka
    MemberAuthor
    >>> import locale, _locale
    >>> _locale.setlocale(locale.LC_CTYPE, 'en_AG')
    'en_AG'
    >>> _locale.setlocale(locale.LC_CTYPE)
    'en_AG'
    >>> locale.getlocale(locale.LC_CTYPE)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/serhiy/py/cpython/Lib/locale.py", line 575, in getlocale
        return _parse_localename(localename)
      File "/home/serhiy/py/cpython/Lib/locale.py", line 484, in _parse_localename
        raise ValueError('unknown locale: %s' % localename)
    ValueError: unknown locale: en_AG

    One solution is proposed in bpo-20079: map all supported in glibc locale names without encoding to locale names with encoding. But see bpo-20087. And default encoding can be different on other systems (not based on glibc).

    Other solution is not guess an encoding, but use locale.nl_langinfo(locale.CODESET) in locale.getlocale(). And left in locale alias table only nonstandard mappings (such as english_uk -> en_GB.ISO8859-1 and sr_yu.iso88595 -> sr_CS.ISO8859-5).

  2. added
    stdlibStandard Library Python modules in the Lib/ directory
    type-bugAn unexpected behavior, bug, or error
    on Dec 28, 2013
  3. BreamoreBoy commented on Feb 12, 2015

    BreamoreBoymannequin
    Mannequin

    With bpo-20079 closed but bpo-20087 still open where do we stand with this issue?

  4. eryksun commented on Feb 12, 2015

    @eryksun
    Contributor

    For 3.5 this affects Windows as well, since the new CRT supports RFC1766 language codes, but only without a codepage spec:

        Python 3.5.0a1 (v3.5.0a1:5d4b6a57d5fd, Feb  7 2015, 18:15:14) 
        [MSC v.1900 64 bit (AMD64)] on win32
        Type "help", "copyright", "credits" or "license" for more information.
        >>> import locale
        >>> locale.setlocale(locale.LC_ALL, 'en-GB')
        'en-GB'
    
        >>> locale.getlocale()
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
          File "C:\Program Files\Python35\lib\locale.py", line 578, in getlocale
            return _parse_localename(localename)
          File "C:\Program Files\Python35\lib\locale.py", line 487, in _parse_localename
            raise ValueError('unknown locale: %s' % localename)
        ValueError: unknown locale: en-GB

    On Vista+ (since 3.5 drops XP support) the codepage can be queried easily via GetLocaleInfoEx:

        >>> from ctypes import *
        >>> LOCALE_IDEFAULTANSICODEPAGE = 0x1004
        >>> GetLocaleInfoEx = WinDLL('kernel32').GetLocaleInfoEx
        >>> info = (c_wchar * 100)()
        >>> GetLocaleInfoEx("en-GB", LOCALE_IDEFAULTANSICODEPAGE, info, len(info)) 
        5
        >>> info.value
        '1252'
        >>> GetLocaleInfoEx("zh-CN", LOCALE_IDEFAULTANSICODEPAGE, info, len(info))
        4
        >>> info.value                                                            
        '936'

    Note that Windows follows the RFC spec here (not POSIX), using a hyphen instead of an underscore.

    This is a bit of tangent, but for the Windows full language_country.codepage form, the X-11 based locale_alias dict is generally useless. So, contrary to the docs, on Windows getlocale doesn't return the language code in RFC 1766 form. In some cases it does, but only by chance.

  5. eryksun commented on Mar 4, 2021

    @eryksun
    Contributor

    The locale_alias database was extended to support "en_AG" and many others, but I'd still prefer Serhiy's suggestion to not guess the codeset when checking the default LC_CTYPE category. Use locale.nl_langinfo(locale.CODESET), if it's available.

    In Windows, I'd prefer to never guess since the encoding for a BCP-47 locale name can be directly queried. But this issue can be restricted to POSIX. What to do in Windows is already being considered in more recent issues: bpo-23425, bpo-37945, and bpo-43115.

  6. transferred this issue fromon Apr 10, 2022
  7. StanFromIreland commented on Mar 23, 2025

    @StanFromIreland
    Member

    This is no longer an issue on Linux, I cannot reproduce in any way, a default is provided (UTF-8), and it seems the windows discussion was moved elsewhere, is there anything to do here?

  8. added
    pendingThe issue will be closed if no feedback is provided
    on Mar 23, 2025
  9. picnixz commented on Apr 1, 2025

    @picnixz
    Member

    I'm going to close this one as it works on Linux.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    pendingThe issue will be closed if no feedback is providedstdlibStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or error

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions