개발/Python

[파이썬] locale error: unsupported locale setting

MinorMan 2023. 1. 21. 22:48
반응형

<질문>

파이썬에서 이 작업을 수행할 때 다음 오류가 발생하는 이유는 무엇입니까?

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

이는 fr 또는 nl과 같은 다른 로케일에서도 작동합니다. 우분투 11.04를 사용하고 있습니다.

업데이트: 다음을 수행해도 결과가 나오지 않습니다.

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

<답변1>

다음 명령 실행

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

이것을 해결할 것입니다.

일치하는지 확인하십시오..UTF-8의 출력에서 발견된 실제 구문의 일부locale -a예를 들어.utf8일부 시스템에서.


<답변2>

에 따르면this link, 다음 명령을 입력하여 해결했습니다.

수출 LC_ALL=C


<답변3>

당신은 아마 아무것도 가지고 있지 않습니다de_DE사용 가능한 로케일.

다음을 사용하여 사용 가능한 로케일 목록을 볼 수 있습니다.locale -a명령. 예를 들어, 내 컴퓨터에서:

$ 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

로케일을 다음으로 설정하려는 경우it_IT당신은 또한 지정해야합니다.utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "", line 1, in 
  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'

새 로케일을 설치하려면 다음을 사용하십시오.

sudo apt-get install language-pack-id

어디id언어 코드입니다(에서 가져옴here)

후에로케일을 설치했다면 Julien Palard의 조언을 따르고 다음을 사용하여 로케일을 재구성해야 합니다.

sudo dpkg-reconfigure locales

<답변4>

위의 답변 중 하나가 솔루션을 제공합니다.

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

위 솔루션의 문제점은 Linux 쉘에서 수행되어야 한다는 것입니다.그러나 클라이언트 시스템에서 작동하도록 코드를 제공하는 경우 이는 잘못된 접근 방식입니다. 또한 os.system()을 사용하여 위의 명령을 실행하려고 시도했지만 여전히 작동하지 않습니다.

나를 위해 일한 솔루션은

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

<답변5>

보다 영구적인 해결책은 다음 명령으로 표시되는 출력에서 누락된 값을 채우는 것입니다.locale

에서 출력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=

누락된 값을 채우려면 ~/.bashrc를 편집합니다.

 $ vim ~/.bashrc

위 명령 뒤에 다음 줄을 추가합니다(en_US.UTF-8을 언어로 지정한다고 가정).

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

이 파일이 읽기 전용인 경우 다음 단계를 따라야 합니다.The GeekyBoy. 에 의해 주어진 답변Dr Beco in Superuser읽기 전용 파일 저장과 관련된 세부 정보가 있습니다.

파일을 저장한 후 다음을 수행합니다.

$ source ~/.bashrc

이제 더 이상 같은 문제에 직면하지 않을 것입니다.


<답변6>

Debian(또는 Debian 포크)을 사용하는 경우 다음을 사용하여 로케일을 추가할 수 있습니다.

dpkg-reconfigure locales

<답변7>

오류가 명확하게 표시됩니다. 로케일을 사용하려고 합니다.

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

locale.Error: 지원되지 않는 로케일 설정

사용 가능한 설정을 확인하려면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

다음 중 하나를 사용할 수 있습니다.

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

~을 위한de_DE

이 파일은 수동으로 조정하거나 update-locale 도구를 사용하여 업데이트할 수 있습니다.

update-locale LANG=de_DE.UTF-8

<답변8>

Arch Linux에서는 다음을 실행하여 이 문제를 해결할 수 있었습니다.sudo locale-gen


<답변9>

기록을 위해 동일한 문제가 있었지만 해결 방법이 없었습니다. 컴퓨터를 업그레이드하고 PC를 마이그레이션했습니다. 저는 영어와 스페인어가 혼합된 로케일을 사용했습니다.

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

하지만 새 데비안 설치에서 영어를 로케일로 선택했습니다. 마침내 작동한 것은 스페인어도 추가하고 생성하도록 로케일 패키지를 재구성하는 것이었습니다.

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

<답변10>

제 생각에는 Python{,3}에서 로컬 로케일을 설정하는 가장 쉬운 방법은 다음과 같습니다.

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

그런 다음 로케일 인식 항목은 괜찮은 Linux 배포판에 있고 다른 OS의 바이너리 배포판에서도 작동해야 합니다(또는 버그 IMHO임).

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

<답변11>

에 배치Dockerfile위로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

<답변12>

.bashrc 파일을 열고 이것을 추가하십시오.

수출 LC_ALL=C

그런 다음 터미널에 source .bashrc를 입력합니다.


<답변13>

  • 이 명령을 실행locale사용되는 로케일을 얻으려면. 와 같은:

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

  • 첫 번째 단계에서 나열된 로케일 목록을 검색하십시오./etc/locale-gen파일. 사용한 것에 대한 주석 해제
  • 운영locale-gen새로 추가된 로케일 생성

<답변14>

새 로케일을 방금 추가한 경우 이 오류가 발생할 수 있습니다. Python 대화형 셸을 다시 시작해야 합니다(quit() 그리고python)에 액세스할 수 있습니다.


<답변15>

내가 당신이라면 BABEL을 사용할 것입니다.http://babel.pocoo.org/en/latest/index.html

Docker를 사용하여 동일한 문제가 발생했습니다. 모든 단일 단계를 시도했지만 제대로 작동하지 않았고 항상 로케일 오류가 발생하여 BABEL을 사용하기로 결정했고 모든 것이 잘 작동했습니다.


<답변16>

python은 .UFT-8을 찾지만 아마도 .utf8이 있을 것입니다. sudo dpkg-reconfigure locales를 사용하여 .UFT-8 패키지를 설치해 보십시오.


<답변17>

도커 이미지를 배포하고locale -a명령, 이 행을 Dockerfile에 추가하십시오.
RUN apt-get install -y locales

이것은 이미지에 모든 로케일을 추가해야 합니다. 저는 AWS 기본 Ubuntu 서버의 일부가 아닌 de_DE를 사용했습니다.


<답변18>

파이썬을 얻으려고 할 때spit out names in specific locale나는 같은 문제로 여기에 도착했습니다.

대답을 추구하면서 상황이 약간 신비스러워졌습니다.

그 파이썬 코드를 찾았습니다.

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

그리고 실제로locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')공장

여기에서 팁을 사용하여 파이썬 코드를 사용하여 사용할 수 있는 것을 확인하기 위해 추가로 테스트했습니다.

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

산출량

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)

그 중 위에서 만 작동합니다! 하지만en_DK.UTF-8작동하지만 이 목록에 없습니다!?!? 뭐?? 그리고 파이썬 생성 로케일 목록에는 내가 찾고 있는 da와 DK의 콤보가 많이 포함되어 있지만 다시 da/DK에 대한 UTF-8은 없습니다...

저는 Point Linux 배포판(Debian 기반)에 있으며 여기locale다른 사람들 사이에서 말한다LC_TIME="en_DK.UTF-8", 작동하는 것으로 알고 있지만 필요한 로케일이 아닙니다.

locale -a말한다

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

그래서 반드시 필요하다install other locale, 내가 편집하여 한/etc/locale.gen, 필요한 줄 주석 해제da_DK.UTF-8 UTF-8명령을 실행locale-gen

지금locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')작동하며 현지화된 요일과 월 이름을 얻을 수 있습니다.

내 결론:

Python: locale.locale_alias는 사용 가능한 로케일을 찾는 데 전혀 도움이 되지 않습니다!!!

Linux : 로케일 목록을 얻고 새 로케일을 설치하는 것은 매우 쉽습니다. 많은 도움을 받을 수 있습니다.

Windows : 조금 조사했지만 결정적인 것은 없습니다. 답변으로 이어지는 게시물이 있지만 추구하고 싶은 충동을 느끼지 않았습니다.


<답변19>

내가 올바르게 이해한다면 여기에서 오류의 주요 원인은 로케일 이름의 정확한 구문입니다. 특히 배포판마다 다른 것처럼 보입니다. 다른 답변/의견에서 여기에 언급된 것을 보았습니다.

de_DE.utf8
de_DE.UTF-8

이것이 분명히 인간에게는 동일하지만 표준 결정적 알고리즘에는 동일하지 않습니다.

따라서 다음과 같은 작업을 수행할 것입니다.

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

<답변20>

먼저 다음을 수행하여 언어 팩이 설치되어 있는지 확인합니다.

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


sudo dpkg-reconfigure locales

<답변21>

이 질문에 대한 답은 아니지만 이 질문은 내 문제에 대한 답을 찾는 데 도움이 되었습니다.

Docker 컨테이너 내부에서 사용할 때 이 문제가 발생했습니다.
locales 를 설치하고 locale.gen 파일에 내 언어를 추가하고 locale-gen (locale.gen에서 읽음)을 실행하고 마지막으로 LANG 을 내 언어로 설정하여 해결했습니다.

예를 들어 내 Dockerfile은 다음과 같습니다.

RUN apt-get install -y locales
RUN echo "pt_BR.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen pt_BR.UTF-8
ENV LANG=pt_BR.UTF-8
반응형