Windows에서 Python의 로케일을 설정하는 올바른 방법은 무엇입니까?


80

로케일 인식 방식으로 문자열 목록을 정렬하려고합니다. 다른 i18n 관련 작업에 Babel 라이브러리를 사용했지만 정렬을 지원하지 않습니다. Python의 locale모듈은 strcoll함수를 제공 하지만 프로세스의 로케일을 작업하려는 로케일로 설정해야합니다. 약간의 고통이지만 나는 그것으로 살 수 있습니다.

문제는 실제로 로케일을 설정할 수 없다는 것입니다. 문서 에 대한 locale모듈은이 예제를 제공합니다 :

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')

그것을 실행하면 다음과 같이 표시됩니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\Lib\locale.py", line 494, in setlocale
locale.Error: unsupported locale setting

내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변:


109

Windows를 사용중인 것 같습니다. 로케일 문자열이 다릅니다. 문서를보다 정확하게 살펴보십시오.

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform

Windows에서는 다음과 같을 것이라고 생각합니다.

locale.setlocale(locale.LC_ALL, 'deu_deu')

MSDN에는 언어 문자열국가 / 지역 문자열 목록이 있습니다.


5
FWIW, 내가 아래에 문제가 있었다 Ubuntu 13.04, Linux 3.8.0-19파이썬으로, 2.7.4에 로케일을 설정하려고 할 때 fr_FR. fr_FR.UTF-8나를 위해 일 하도록 설정했습니다 .
Zoneur 2013-09-11

Conda 4.4.11, Windows 7의 Python 3.6.3의 경우 로케일 문자열이 다른 OS와 동일하게 보입니다.
srodriguex


2
링크 된 문서가 WServer2018R2에 비해 너무 최근 인 것 같습니다 'eng_usa'( 'en_US'작동하지 않음)
Boop

17

이것이 독일어 로케일에 대한 예제를 제공하는 유일한 올바른 사용 방법입니다.

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)

1
이것은 실제로 질문에 대답하는 유일한 대답입니다.
ImportanceOfBeingErnest

이 절 도와 줬어요,하지만 난 변경했습니다 GermanPortuguese_Brazil.1252. 이러한 값을 나열하는 문서를 알고 있습니까?
Henrique Brisola

15

setlocale에 명시 적 로케일전달 해서는 안됩니다 . 잘못된 것입니다. 환경에서 알아 내십시오. 빈 문자열을 전달해야합니다.

import locale
locale.setlocale(locale.LC_ALL, '')

10
직접 관련이 없기 때문에 질문에서 언급하지 않았지만 당시에 작성했던 코드는 웹 서버에서 사용하도록 설계되었습니다. 즉, 로케일은 각 요청에 따라 변경 될 수 있으며 환경의 로케일과 반드시 ​​동일하지는 않습니다.
DNS

2
DNS : 로케일 문서를 읽었습니까? setlocale "much"를 호출하는 것은 위험 할 수 있으며 스레드로부터 안전하지 않습니다. 따라서 아마도 setlocale 이외의 것이 해결책입니다. 예를 들어 Gettext는 다른 카탈로그를로드하고 런타임에 전환 할 수 있습니다. 그러나 나는 당신이 로케일을 무엇에 사용하고 있는지 모릅니다.
u0b34a0f6ae

사용자가 로컬 시스템에 있지 않는 한
가브리엘

8

우분투

Ubuntu에서는 시스템에 해당 로컬이 설치되어 있지 않기 때문에이 문제가 발생할 수 있습니다.

쉘에서 다음을 시도하십시오.

$> locale -a

관심있는 로케일이 있는지 확인하십시오. 그렇지 않으면 설치해야합니다.

$> sudo apt-get install language-pack-XXX

여기서 XXX는 귀하의 언어입니다 (제 경우에는 "xxx = it", 이탈리아어 로케일). 그런 다음 다음을 실행하십시오 dpkg-reconfigure.

$> sudo dpkg-reconfigure locales

그 후 파이썬 셸에서 다시 시도하십시오.

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

(이것은 내가 필요한 이탈리아어 로케일을위한 것입니다)


13
이 질문은 특히 Windows에 대해 묻습니다
Christoph

7

나는 이것이 몇 년 전에 요청되었다는 것을 알고 있지만 Windows에서 Python 3.6을 사용하여 내가 찾은 것을 추가하려고 생각했습니다.

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))

나는 몇 가지를 시도했고 그것은 또한 Windows에서 사용할 수있는 것을 찾는 방법 인 것 같습니다.

알아두면 좋은 점 : 이것은 어떤 이유로 현재 안정된 Python 버전에서 strptime ()과 호환되지 않습니다.

그런 다음 로케일을 설정하기 만하면됩니다.

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


4

locale.setlocale 문서에서 :

locale.setlocale(category, locale=None):
    """
    Set the locale for the given category.  The locale can be
    a string, an iterable of two strings (language code and encoding),
    or None.
    """"

Linux (특히 Ubuntu)에서는 다음 중 하나를 사용할 수 있습니다.

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

또는

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))

로케일이 시스템에 설치되지 않은 경우 동일한 오류가 발생합니다 . 따라서 시스템에 로케일이 설치되어 있는지 확인하십시오 .

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.