python / python/cpython

locale.getlocale() returns wrong encoding if the locale name doesn't have one

Offen
#151,316 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

stdlib topic-unicode type-bug
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug report

Bug description:

Some locales don't have an encoding especifier, and python (wrongly) assumes it is ISO-8859-1, when it may not be. For example, the following code:

import locale

l = locale.getlocale()
print(f"locale: {l}, encoding: {locale.getencoding()}")
locale.setlocale(locale.LC_ALL, l)

Returns:

$ LANG=en_GB.UTF-8 python3 test.py 
locale: ('en_GB', 'UTF-8'), encoding: UTF-8
$ LANG=en_IN python3 test.py 
locale: ('en_IN', 'ISO8859-1'), encoding: UTF-8
Traceback (most recent call last):
  File "/home/emilio/profesional/freexian-ext/test.py", line 5, in <module>
    locale.setlocale(locale.LC_ALL, l)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/locale.py", line 615, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Traceback (most recent call last):
  File "/home/emilio/test.py", line 5, in <module>
    locale.setlocale(locale.LC_ALL, l)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/locale.py", line 615, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

The en_IN locale uses UTF-8, which is correctly returned in locale.getencoding(), but not in locale.getlocale(). Using the tuple returned by locale.getlocale() in a setlocale call fails.

This probably affects other locales that use UTF-8 as their encoding but don't especify it in the locale name.

This was tested on Debian stable (trixie) with Python 3.13.

CPython versions tested on:

3.13

Operating systems tested on:

Linux

Linked PRs
  • gh-155549

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Der Bericht verweist auf locale.py und enthält ein reproduzierbares test.py-Beispiel; beginne damit, es unter Linux mit LANG=en_IN auszuführen und locale.getlocale() mit locale.getencoding() zu vergleichen. Als erledigt gilt die Änderung, wenn locale.getlocale() die nutzbare UTF-8-Kodierung für Locales beibehält, deren Namen keine Kodierung angeben, sodass die Übergabe seines Ergebnisses an locale.setlocale() nicht mehr fehlschlägt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
localization
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.