Errore locale Python: impostazione locale non supportata


317

Perché ottengo il seguente errore quando lo faccio in Python:

>>> 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

Funziona anche con altre versioni locali come fr o nl. Sto usando Ubuntu 11.04.

Aggiornamento: Effettuare quanto segue non ha prodotto nulla:

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

8
Hai un de_DEannuncio in locale -a? Altrimenti è necessario installarlo .
Bakuriu,

1
Correlati: uno script bash per installare tutte le versioni locali su Ubuntu.
rkrzr,

12
locale.setlocale(locale.LC_ALL, 'de_DE')è sbagliato. Hai bisogno locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma,

2
A volte è possibile scoprire una codifica disponibile per la lingua / paese che si desidera utilizzare il built-in alias: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray,

Risposte:


647

Esegui i seguenti comandi

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

Risolverà questo.

Assicurarsi di far corrispondere la .UTF-8parte alla sintassi effettiva trovata nell'output di locale -aes. .utf8Su alcuni sistemi.


8
Non ho dovuto usare il comando dpkg. Dopotutto, se il problema si verifica localmente, la vera soluzione sarebbe quella di aggiungere i primi due comandi alle applicazioni di avvio.
RolandiXor

2
Questo non ha funzionato per me. export LC_ALL="en_US.UTF-8"fallito con -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Ciò che ha funzionato è stato fare questo:export LC_ALL=C
Jonathan il


197

Probabilmente non ne hai de_DE locale disponibile.

È possibile visualizzare un elenco di impostazioni locali disponibili con il locale -acomando. Ad esempio, sulla mia macchina:

$ 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

Si noti che se si desidera impostare la locale su it_ITè necessario specificare anche .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'

Per installare una nuova locale usare:

sudo apt-get install language-pack-id

dov'è idil codice della lingua (preso da qui )

Dopo aver installato le impostazioni internazionali, è necessario seguire i consigli di Julien Palard e riconfigurare le impostazioni locali con:

sudo dpkg-reconfigure locales

Non ha funzionato nel mio contenitore Debian docker. Ma ha funzionato. stackoverflow.com/questions/28405902/…
Chris,

45

Una delle risposte sopra fornisce la soluzione:

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

Il problema con la soluzione sopra è che deve essere fatto sulla shell di Linux. Tuttavia, se si sta fornendo il codice per funzionare sul computer client, questo è un approccio errato. Ho anche provato a eseguire i comandi sopra usando os.system (), ma non funziona ancora.

La soluzione che ha funzionato per me è

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')

32

Una soluzione più permanente sarebbe quella di riempire i valori mancanti, nell'output mostrato dal comando: locale

L'output da localeè:

 $ 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=

Per riempire i valori mancanti, modifica ~ / .bashrc:

 $ vim ~/.bashrc

Aggiungi le seguenti righe dopo il comando sopra (supponi di voler en_US.UTF-8 come lingua):

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

Se questo file è ReadOnly, dovrai seguire i passaggi indicati da The GeekyBoy . La risposta data dal dott. Beco in Superuser contiene dettagli relativi al salvataggio dei file di sola lettura.

Dopo aver salvato il file fai:

$ source ~/.bashrc

Ora non dovrai più affrontare lo stesso problema.



6

Su Arch Linux sono stato in grado di risolvere questo problema eseguendo sudo locale-gen


4

Per la cronaca, ho avuto lo stesso problema, ma nessuna delle soluzioni ha funzionato. Avevo aggiornato il mio computer e migrato il mio PC. Ho avuto un misto inglese e spagnolo locale:

$ 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=

Ma, sulla mia nuova installazione di Debian, ho appena selezionato l'inglese come locale. Che alla fine ha funzionato è stato riconfigurare il pacchetto locales per aggiungere e generare anche lo spagnolo.

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

4

Apri il file .bashrc e aggiungi questo

export LC_ALL = C

e quindi digitare sorgente .bashrc nel terminale.


4

Il tuo errore dice chiaramente che stai provando a usare le impostazioni locali qualcosa che non c'era.

>>> 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: impostazione locale non supportata

Per verificare le impostazioni disponibili, utilizzare 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

così puoi usarne uno tra,

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

per de_DE

Questo file può essere modificato manualmente o aggiornato utilizzando lo strumento, aggiorna-impostazioni internazionali.

update-locale LANG=de_DE.UTF-8

2
  • eseguire questo comando localeper ottenere le impostazioni locali utilizzate. Ad esempio:

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 =

  • cerca l'elenco delle lingue elencate nel primo passaggio /etc/locale-gen file. Uncomment a quelli usati
  • eseguire locale-genper generare nuove impostazioni locali aggiunte

2

Secondo me, il modo più semplice per configurare le impostazioni locali in Python {, 3} è:

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

Quindi, le cose a conoscenza delle impostazioni locali funzionano, se sei su una distribuzione Linux decente, e dovrebbero funzionare anche sulle distribuzioni binarie degli altri sistemi operativi (o questo è un bug IMHO).

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

2

Posizionalo Dockerfilesopra il 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

Grazie, ho provato le altre soluzioni (dpkg-reconfigure locales, locale-gen) e nient'altro ha funzionato nel mio debian: 9 container. È davvero un / il modo standard per creare la locale en_US.UTF-8?
jamshid,

Sì, penso che sia la modalità standard en_US.UTF-8 locale. Quando corri localenel terminal ottieni `LANG = en_US.UTF-8 e altre impostazioni locali? stackoverflow.com/questions/36394101/…
Seenu S

1

Questo errore può verificarsi se hai appena aggiunto una nuova locale. È necessario riavviare la shell interattiva di Python ( quit() e python) per accedere ad essa.


1

Se fossi in te, userei BABEL: http://babel.pocoo.org/en/latest/index.html

Ho avuto lo stesso problema qui usando Docker, ho provato ogni singolo passaggio e non ha funzionato bene, ottenendo sempre errori di localizzazione, quindi ho deciso di utilizzare BABEL e tutto ha funzionato bene.


0

Nel tentativo di ottenere Python per sputare i nomi in specifiche impostazioni internazionali sono arrivato qui con lo stesso problema.

Nel perseguire la risposta, le cose sono diventate un po 'mistiche che trovo.

Ho trovato quel codice Python.

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

E davvero locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')funziona

Utilizzando i suggerimenti qui ho testato ulteriormente per vedere cosa è disponibile utilizzando il codice Python

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

quale cede

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)

Di cui solo sopra funziona! Ma ilen_DK.UTF-8 non è in questo elenco, sebbene funzioni!?!? Che cosa?? E l'elenco delle impostazioni locali generato da Python contiene molte combinazioni di da e DK, che sto cercando, ma ancora nessuna UTF-8 per da / DK ...

Sono su una distro Point Linux (basata su Debian), e qui localedice tra l'altro LC_TIME="en_DK.UTF-8"che so che funziona, ma non le impostazioni locali di cui ho bisogno.

locale -a dice

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

Quindi ho sicuramente bisogno di installare altre impostazioni locali , cosa che ho fatto modificando /etc/locale.gen, decommentando la riga necessaria da_DK.UTF-8 UTF-8ed eseguendo il comandolocale-gen

Ora locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')funziona anche e posso ottenere i miei nomi di giorno e mese localizzati.

La mia conclusione:

Python: locale.locale_alias non è affatto utile per trovare le localizzazioni disponibili !!!

Linux: è abbastanza facile ottenere l'elenco delle impostazioni locali e installare nuove impostazioni locali. Molto aiuto disponibile.

Windows: ho studiato un po ', ma niente di conclusivo. Ci sono però post che portano a risposte, ma non ho sentito l'impulso di perseguirlo.


0

se ho capito bene, la principale fonte di errore qui è l'esatta sintassi del nome-locale. Soprattutto perché sembra differire tra le distribuzioni. Ho visto menzionato qui in diverse risposte / commenti:

de_DE.utf8
de_DE.UTF-8

Anche se questo è ovviamente lo stesso per un essere umano, lo stesso non vale per il tuo algoritmo deterministico standard.

Quindi probabilmente farai qualcosa del genere:

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

0

python cerca .UFT-8, ma probabilmente hai .utf8 prova a installare i pacchetti .UFT-8 con sudo dpkg-reconfigure locales


-2

per prima cosa, assicurati di avere installato il language pack eseguendo:

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


sudo dpkg-reconfigure locales

il languagepack inglese è installato di default - inoltre la risposta è già data qui e questa manca nella formulazione.
Skandix
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.