Python-Gebietsschema-Fehler: Nicht unterstützte Gebietsschemaeinstellung

317

Warum erhalte ich den folgenden Fehler, wenn ich dies in Python mache:

>>> import locale
>>> print str( locale.getlocale() )
(None, None)
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 531, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Dies funktioniert auch mit anderen Gebietsschemas wie fr oder nl. Ich benutze Ubuntu 11.04.

Update: Folgendes hat nichts gebracht:

dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
toom
quelle
8
Haben Sie eine de_DEListe in locale -a? Wenn nicht, müssen Sie es installieren .
Bakuriu
1
Verwandte: ein Bash-Skript , um alle Gebietsschemas unter Ubuntu zu installieren.
rkrzr
12
locale.setlocale(locale.LC_ALL, 'de_DE')ist falsch. Du brauchst locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma
2
Mit den integrierten Aliasnamen können Sie manchmal eine verfügbare Codierung für die gewünschte Sprache / das gewünschte Land ermitteln : locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Antworten:

647

Führen Sie die folgenden Befehle aus

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

Es wird dies lösen.

Stellen Sie sicher, dass der .UTF-8Teil mit der tatsächlichen Syntax übereinstimmt, die in der Ausgabe von locale -az .utf8. B. auf einigen Systemen enthalten ist.

Muhammad Hassan
quelle
8
Ich musste den Befehl dpkg nicht verwenden. Wenn das Problem lokal auftritt, besteht die eigentliche Lösung darin, die ersten beiden Befehle zu Ihren Startanwendungen hinzuzufügen.
RolandiXor
2
Das hat bei mir nicht funktioniert. export LC_ALL="en_US.UTF-8"gescheitert mit -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Was funktionierte war dies zu tun:export LC_ALL=C
Jonathan
203

Laut diesem Link wurde es durch Eingabe dieses Befehls gelöst:

export LC_ALL = C.

Fatemeh Abdollahei
quelle
4
Was bedeutet das? - ok, es setzt eine Umgebungsvariable LC_ALLauf den Wert 'C'- aber warum sollte das funktionieren?
Martin Thoma
3
Warum LC_ALL funktioniert -> unix.stackexchange.com/questions/87745/what-does-lc-all-c-do
Ferhat
Ich suche und versuche dies jedes Mal, wenn ich den Computer wechsle, und dies funktioniert jedes Mal, wenn andere Methoden dies nicht tun.
MinKi Jo
Ich habe mein Problem direkt gelöst, vielen Dank!
Tahirhan
197

Sie haben wahrscheinlich kein de_DEGebietsschema verfügbar.

Mit dem locale -aBefehl können Sie eine Liste der verfügbaren Gebietsschemas anzeigen . Zum Beispiel auf meinem Computer:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
it_CH.utf8
it_IT.utf8
POSIX

Beachten Sie, dass Sie, wenn Sie das Gebietsschema it_ITfestlegen möchten, auch Folgendes angeben müssen .utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 539, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8')
'it_IT.utf8'

So installieren Sie ein neues Gebietsschema:

sudo apt-get install language-pack-id

Wo idist der Sprachcode (von hier übernommen )

Nachdem Sie das Gebietsschema installiert haben, sollten Sie den Ratschlägen von Julien Palard folgen und die Gebietsschemas neu konfigurieren mit:

sudo dpkg-reconfigure locales
Bakuriu
quelle
Das hat in meinem Debian-Docker-Container nicht funktioniert. Aber das hat funktioniert. stackoverflow.com/questions/28405902/…
Chris
45

Eine der obigen Antworten bietet die Lösung:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

Das Problem mit der obigen Lösung ist, dass es auf der Linux-Shell durchgeführt werden muss. Wenn Sie jedoch Ihren Code für die Arbeit auf dem Clientcomputer bereitstellen, ist dies ein schlechter Ansatz. Ich habe auch versucht, die obigen Befehle mit os.system () auszuführen, aber es funktioniert immer noch nicht.

Lösung, die für mich funktioniert hat, ist

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
Ayush Vatsyayan
quelle
32

Eine dauerhaftere Lösung wäre, die fehlenden Werte in der durch den Befehl angezeigten Ausgabe zu füllen: locale

Ausgabe von localeist:

 $ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Um die fehlenden Werte zu füllen, bearbeiten Sie ~ / .bashrc:

 $ vim ~/.bashrc

Fügen Sie nach dem obigen Befehl die folgenden Zeilen hinzu (nehmen Sie an, dass en_US.UTF-8 Ihre Sprache sein soll):

export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

Wenn diese Datei ReadOnly ist, müssen Sie die von The GeekyBoy genannten Schritte ausführen . Die Antwort von Dr. Beco in Superuser enthält Details zum Speichern schreibgeschützter Dateien.

Nach dem Speichern der Datei gehen Sie wie folgt vor:

$ source ~/.bashrc

Jetzt stehen Sie nicht mehr vor dem gleichen Problem.

Lorenzofeliz
quelle
15

Wenn Sie sich in einem Debian (oder einer Debian-Gabel) befinden, können Sie Gebietsschemas hinzufügen, indem Sie:

dpkg-reconfigure locales
Julien Palard
quelle
Hat das dpkg-reconfigure localesbringen Sie eine lokale Wahl Menü wie diese: vpser.net/uploads/2013/01/dpkg-reconfigure-locales-1.jpg ?
Julien Palard
Nee. Ich bekomme nur die Ausgabe, die ich im Update meiner Frage gepostet habe.
Toom
6

Unter Arch Linux konnte ich dies durch Ausführen beheben sudo locale-gen

Keith Smiley
quelle
4

Für die Aufzeichnung hatte ich das gleiche Problem, aber keine der Lösungen funktionierte. Ich hatte meinen Computer aktualisiert und meinen PC migriert. Ich hatte ein gemischtes Gebietsschema Englisch und Spanisch:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Bei meiner neuen Debian-Installation habe ich jedoch nur Englisch als Gebietsschema ausgewählt. Was schließlich funktionierte, war die Neukonfiguration des Gebietsschemapakets, um auch Spanisch hinzuzufügen und zu generieren.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
kikeenrique
quelle
4

Öffnen Sie einfach die .bashrc-Datei und fügen Sie diese hinzu

export LC_ALL = C.

und geben Sie dann source .bashrc in terminal ein.

Saroj Rai
quelle
4

Ihr Fehler besagt eindeutig, dass Sie versuchen, das Gebietsschema zu verwenden. Etwas war nicht vorhanden.

>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

locale.Error: Nicht unterstützte Gebietsschemaeinstellung

Verwenden Sie, um die verfügbaren Einstellungen zu überprüfen locale -a

deb@deb-Latitude-E7470:/ambot$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

so können Sie eine unter verwenden,

>>> locale.setlocale(locale.LC_ALL, 'en_AG.utf8')
'en_AG.utf8'
>>> 

zum de_DE

Diese Datei kann entweder manuell angepasst oder mit dem Tool update-locale aktualisiert werden.

update-locale LANG=de_DE.UTF-8
Mohideen bin Mohammed
quelle
2
  • Führen Sie diesen Befehl aus locale, um zu ermitteln, welches Gebietsschema verwendet wird. Sowie:

LANG = en_US.UTF-8
LANGUAGE = en_US: en
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LC_MONETARY = "en_US .UTF-8 "
LC_MESSAGES =" en_US.UTF-8 "
LC_PAPER =" en_US.UTF-8 "
LC_NAME =" en_US.UTF-8 "
LC_ADDRESS =" en_US.UTF-8 "
LC_TELEPHONE =" en_US.UTF-8 "
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL =

  • Suchen Sie im ersten Schritt der /etc/locale-genDatei nach der Liste der aufgelisteten Gebietsschemas . Kommentar zu gebrauchten
  • Ausführen locale-gen, um neu hinzugefügte Gebietsschemas zu generieren
Andy
quelle
2

Meiner Meinung nach ist der einfachste Weg, das lokale Gebietsschema in Python {, 3} einzurichten:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'

Dann funktioniert das Gebietsschema nur, wenn Sie sich in einer anständigen Linux-Distribution befinden und auch mit Binärdistributionen der anderen Betriebssysteme funktionieren sollten (oder das ist meiner Meinung nach ein Fehler).

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016
user3780002
quelle
2

Legen Sie es Dockerfileoben in die ENV.

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.UTF-8
Seenu S.
quelle
Danke, ich habe die anderen Lösungen ausprobiert (dpkg-recfigure locales, locale-gen) und nichts anderes hat in meinem debian: 9-Container funktioniert. Ist dies wirklich eine Standardmethode zum Erstellen des Gebietsschemas en_US.UTF-8?
Jamshid
Ja, ich denke, es ist die Standardmethode für das Gebietsschema en_US.UTF-8. Wenn Sie localeim Terminal laufen, erhalten Sie `LANG = en_US.UTF-8 und ein anderes Gebietsschema? stackoverflow.com/questions/36394101/…
Seenu S
1

Dieser Fehler kann auftreten, wenn Sie gerade ein neues Gebietsschema hinzugefügt haben. Sie müssen die interaktive Python-Shell ( quit() und python) neu starten , um Zugriff darauf zu erhalten.

imrek
quelle
1

Wenn ich Sie wäre, würde ich BABEL verwenden: http://babel.pocoo.org/en/latest/index.html

Ich habe hier mit Docker das gleiche Problem. Ich habe jeden einzelnen Schritt ausprobiert und nicht gut funktioniert. Es wurde immer ein Gebietsschemafehler angezeigt. Deshalb habe ich mich für BABEL entschieden, und alles hat gut funktioniert.

Carlos
quelle
0

Beim Versuch, Python dazu zu bringen , Namen in einem bestimmten Gebietsschema auszuspucken, landete ich hier mit demselben Problem.

Als ich die Antwort verfolgte, wurden die Dinge ein wenig mystisch, wie ich finde.

Ich habe diesen Python-Code gefunden.

import locale
print locale.getdefaultlocale()
>> ('en_DK', 'UTF-8')

Und locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')funktioniert tatsächlich

Anhand der hier aufgeführten Tipps habe ich weiter getestet, um festzustellen, was mit Python-Code verfügbar ist

import locale
loc_list = [(a,b) for a,b in locale.locale_alias.items() ]
loc_size = len(loc_list)
print loc_size,'entries'

for loc in loc_list:
    try:
        locale.setlocale(locale.LC_TIME, loc[1])
        print 'SUCCES set {:12} ({})'.format(loc[1],loc[0])
    except:
        pass

was ergibt

858 entries
SUCCES set en_US.UTF-8  (univ)
SUCCES set C            (c.ascii)
SUCCES set C            (c.en)
SUCCES set C            (posix-utf2)
SUCCES set C            (c)
SUCCES set C            (c_c)
SUCCES set C            (c_c.c)
SUCCES set en_IE.UTF-8  (en_ie.utf8@euro)
SUCCES set en_US.UTF-8  (universal.utf8@ucs4)
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

Davon funktioniert nur oben! Aber das en_DK.UTF-8ist nicht in dieser Liste, obwohl es funktioniert!?!? Was?? Und die von Python generierte Gebietsschemaliste enthält viele Kombinationen von da und DK, nach denen ich suche, aber auch hier kein UTF-8 für da / DK ...

Ich bin auf einer Point Linux-Distribution (Debian-basiert) und localesage hier unter anderem LC_TIME="en_DK.UTF-8", was ich weiß, funktioniert, aber nicht das Gebietsschema, das ich brauche.

locale -a sagt

C
C.UTF-8
en_DK.utf8
en_US.utf8
POSIX

Also muss auf jeden Fall ein anderes Gebietsschema installiert werden , was ich durch Bearbeiten /etc/locale.gen, Kommentieren der benötigten Zeile da_DK.UTF-8 UTF-8und Ausführen des Befehls getan habelocale-gen

Funktioniert jetzt locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')auch und ich kann meine lokalisierten Tages- und Monatsnamen abrufen.

Meine Schlussfolgerung:

Python: locale.locale_alias ist überhaupt nicht hilfreich, um verfügbare Gebietsschemas zu finden !!!

Linux: Es ist ziemlich einfach, eine Gebietsschemaliste abzurufen und ein neues Gebietsschema zu installieren. Viel Hilfe zur Verfügung.

Windows: Ich habe ein wenig nachgeforscht, aber nichts schlüssiges. Es gibt zwar Beiträge, die zu Antworten führen, aber ich habe nicht den Drang verspürt, sie weiterzuverfolgen.

DonPedro
quelle
0

Wenn ich das richtig verstehe, ist die Hauptfehlerquelle hier die genaue Syntax des Gebietsschemas. Zumal es sich zwischen den Distributionen zu unterscheiden scheint. Ich habe hier in verschiedenen Antworten / Kommentaren erwähnt gesehen:

de_DE.utf8
de_DE.UTF-8

Auch wenn dies für einen Menschen offensichtlich dasselbe ist, gilt dies nicht für Ihren deterministischen Standardalgorithmus.

Sie werden also wahrscheinlich etwas in der Art von:

DESIRED_LOCALE=de
DESIRED_LOCALE_COUNTRY=DE
DESIRED_CODEPAGE_RE=\.[Uu][Tt][Ff].?8
if [ $(locale -a | grep -cE "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}") -eq 1 ]
then
    export LC_ALL=$(locale -a | grep -m1 -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")
    export LANG=$LC_ALL
else
    echo "Not exactly one desired locale definition found: $(locale -a | grep -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")" >&2
fi
Torge Husfeldt
quelle
0

Python sucht nach .UFT-8, aber Sie haben wahrscheinlich .utf8 versucht, die .UFT-8-Pakete mit sudo dpkg-recfigure locales zu installieren

Peter Frumau
quelle
-2

Stellen Sie zunächst sicher, dass Sie das Sprachpaket installiert haben, indem Sie Folgendes tun:

sudo apt-get install language-pack-en-base


sudo dpkg-reconfigure locales
Yaron Soffer
quelle
Das englische Sprachpaket ist standardmäßig installiert - außerdem wird hier bereits die Antwort gegeben, und diese fehlt bei der Formatierung.
Skandix