Kesalahan lokal python: pengaturan lokal tidak didukung


317

Mengapa saya mendapatkan kesalahan berikut saat melakukan ini dengan 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

Ini berfungsi dengan lokal lain seperti fr atau nl juga. Saya menggunakan Ubuntu 11.04.

Pembaruan: Melakukan hal berikut ini tidak menghasilkan apa-apa:

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
Apakah Anda memiliki de_DEdaftar locale -a? Jika tidak, Anda harus menginstalnya .
Bakuriu

1
Terkait: skrip bash untuk menginstal semua lokal di Ubuntu.
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')salah. Kamu butuh locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma

2
Anda kadang-kadang dapat menemukan sebuah encoding yang tersedia untuk bahasa / negara Anda ingin menggunakan built-in alias: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Jawaban:


647

Jalankan perintah berikut

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

Ini akan menyelesaikan ini.

Pastikan untuk mencocokkan .UTF-8bagian dengan sintaks aktual yang ditemukan dalam output locale -amisalnya .utf8pada beberapa sistem.


8
Saya tidak harus menggunakan perintah dpkg. Bagaimanapun, jika masalah terjadi secara lokal, maka solusi sebenarnya adalah menambahkan dua perintah pertama ke aplikasi startup Anda.
RolandiXor

2
Ini tidak berhasil untuk saya. export LC_ALL="en_US.UTF-8"gagal dengan -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Apa yang berhasil lakukan ini:export LC_ALL=C
Jonathan


197

Anda mungkin tidak memiliki de_DElokal yang tersedia.

Anda dapat melihat daftar lokal yang tersedia dengan locale -aperintah. Misalnya, di komputer saya:

$ 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

Perhatikan bahwa jika Anda ingin mengatur lokal ke it_ITAnda juga harus menentukan .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'

Untuk menginstal penggunaan lokal baru:

sudo apt-get install language-pack-id

di mana idkode bahasa (diambil dari sini )

Setelah Anda menginstal lokal, Anda harus mengikuti saran Julien Palard dan mengkonfigurasi ulang lokal dengan:

sudo dpkg-reconfigure locales

Itu tidak bekerja di wadah buruh pelabuhan Debian saya. Tapi ini berhasil. stackoverflow.com/questions/28405902/…
Chris

45

Salah satu jawaban di atas memberikan solusinya:

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

Masalah dengan solusi di atas adalah bahwa hal itu harus dilakukan pada shell linux. Namun, jika Anda menyediakan kode untuk bekerja pada mesin klien maka ini merupakan pendekatan yang buruk. Saya juga mencoba menjalankan perintah di atas menggunakan os.system (), tetapi tetap saja tidak berhasil.

Solusi yang berhasil bagi saya adalah

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

32

Solusi yang lebih permanen adalah dengan mengisi nilai-nilai yang hilang, dalam output yang ditunjukkan oleh perintah: locale

Output dari localeadalah:

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

Untuk Mengisi nilai yang hilang, edit ~ / .bashrc:

 $ vim ~/.bashrc

Tambahkan baris berikut setelah perintah di atas (misalkan Anda ingin en_US.UTF-8 menjadi bahasa Anda):

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

Jika file ini ReadOnly, Anda harus mengikuti langkah-langkah yang disebutkan oleh The GeekyBoy . Jawaban yang diberikan oleh Dr Beco di Superuser memiliki detail terkait dengan menyimpan file yang hanya bisa dibaca.

Setelah menyimpan file lakukan:

$ source ~/.bashrc

Sekarang Anda tidak akan menghadapi masalah yang sama lagi.



6

Di Arch Linux saya bisa memperbaiki ini dengan menjalankan sudo locale-gen


4

Sebagai catatan, saya memiliki masalah yang sama, tetapi tidak ada solusi yang berhasil. Saya telah memutakhirkan komputer saya dan memigrasikan PC saya. Saya memiliki campuran bahasa Inggris dan Spanyol:

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

Tetapi, pada instalasi Debian baru saya, saya baru saja memilih bahasa Inggris sebagai lokal. Yang akhirnya berhasil adalah mengkonfigurasi ulang paket locales untuk menambah dan menghasilkan spanyol juga.

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

4

Cukup buka file .bashrc dan tambahkan ini

ekspor LC_ALL = C

dan kemudian ketikkan source .bashrc di terminal.


4

Anda kesalahan jelas mengatakan, Anda mencoba menggunakan lokal sesuatu tidak ada di sana.

>>> 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: pengaturan lokal yang tidak didukung

Untuk memeriksa pengaturan yang tersedia, gunakan 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

sehingga Anda dapat menggunakan satu di antara,

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

untuk de_DE

File ini dapat disesuaikan secara manual atau diperbarui menggunakan alat, perbarui-lokal.

update-locale LANG=de_DE.UTF-8

2
  • jalankan perintah ini localeuntuk mendapatkan lokal apa yang digunakan. Seperti:

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 =

  • mencari daftar lokal yang terdaftar di langkah pertama dalam /etc/locale-genfile. Batalkan komentar untuk yang digunakan
  • jalankan locale-genuntuk menghasilkan lokal yang baru ditambahkan

2

Menurut pendapat saya, cara termudah untuk mengatur lokal lokal di python {, 3} adalah:

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

Kemudian, hal-hal yang disadari lokal hanya berfungsi, jika Anda menggunakan distro linux yang layak, dan harus bekerja pada distribusi biner dari OS lain juga (atau itu bug IMHO).

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

2

Tempatkan di Dockerfileatas 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

Terima kasih, saya mencoba solusi lain (dpkg-reconfigure locales, local-gen) dan tidak ada yang berhasil di debian saya: 9 container. Apakah ini benar-benar cara standar untuk membuat lokal en_US.UTF-8?
jamshid

Ya, saya pikir ini cara standar lokal en_US.UTF-8. Ketika Anda menjalankan localeterminal Anda mendapatkan `LANG = en_US.UTF-8 dan lokal lainnya? stackoverflow.com/questions/36394101/…
Seenu S

1

Kesalahan ini dapat terjadi, jika Anda baru saja menambahkan lokal baru. Anda harus memulai ulang shell interaktif python ( quit() dan python) untuk mendapatkan akses ke sana.


1

Jika saya jadi Anda, saya akan menggunakan BABEL: http://babel.pocoo.org/en/latest/index.html

Saya mendapat masalah yang sama di sini menggunakan Docker, saya sudah mencoba setiap langkah dan tidak bekerja dengan baik, selalu mendapatkan kesalahan lokal, jadi saya memutuskan untuk menggunakan BABEL, dan semuanya bekerja dengan baik.


0

Dalam mencoba mendapatkan python untuk memuntahkan nama-nama di lokal tertentu saya mendarat di sini dengan masalah yang sama.

Dalam mengejar jawaban, saya mendapat hal-hal mistis.

Saya menemukan kode python itu.

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

Dan memang locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')berhasil

Menggunakan tips di sini saya diuji lebih lanjut untuk melihat apa yang tersedia menggunakan kode 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

yang menghasilkan

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)

Yang hanya berfungsi di atas! Tetapi en_DK.UTF-8tidak ada dalam daftar ini, meskipun berfungsi!?!? Apa?? Dan daftar lokal yang dihasilkan python memang mengandung banyak kombo da dan DK, yang saya cari, tapi sekali lagi tidak ada UTF-8 untuk da / DK ...

Saya berada di distro Point Linux (berbasis Debian), dan di sini localemengatakan antara lain LC_TIME="en_DK.UTF-8", yang saya tahu berfungsi, tetapi bukan lokal yang saya butuhkan.

locale -a kata

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

Jadi pasti perlu menginstal lokal lain , yang saya lakukan dengan mengedit /etc/locale.gen, batalkan komentar yang diperlukan baris da_DK.UTF-8 UTF-8dan jalankan perintahlocale-gen

Sekarang locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')berfungsi juga, dan saya bisa mendapatkan nama hari dan bulan yang dilokalkan.

Kesimpulan saya:

Python: locale.locale_alias sama sekali tidak membantu dalam menemukan lokal yang tersedia !!!

Linux: Sangat mudah untuk mendapatkan daftar lokal dan menginstal lokal baru. Banyak bantuan yang tersedia.

Windows: Saya telah menyelidiki sedikit, tetapi tidak ada yang meyakinkan. Meskipun ada posting yang mengarah ke jawaban, tapi saya belum merasakan keinginan untuk mengejarnya.


0

jika saya mengerti dengan benar, sumber kesalahan utama di sini adalah sintaks yang tepat dari nama lokal. Terutama karena tampaknya berbeda di antara distribusi. Saya telah melihat yang disebutkan di sini dalam berbagai jawaban / komentar:

de_DE.utf8
de_DE.UTF-8

Meskipun ini jelas sama untuk manusia, hal yang sama tidak berlaku untuk algoritma deterministik standar Anda.

Jadi, Anda mungkin akan melakukan sesuatu seperti:

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 mencari .UFT-8, tetapi Anda mungkin sudah .utf8 mencoba menginstal paket .UFT-8 dengan sudo dpkg-reconfigure locales


-2

pertama, pastikan Anda telah menginstal paket bahasa dengan melakukan:

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


sudo dpkg-reconfigure locales

bahasa inggris languagepack diinstal per default - selanjutnya jawabannya sudah diberikan di sini dan yang ini kurang dalam memformat.
Skandix
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.