Skip to content

C:setlocale

런타임 로캘을 설정하거나 가져옵니다.

Category

영향을받는 로케일의 일부입니다. clocale에서 매크로로 정의 된 다음 상수 값 중 하나입니다.

value

Portion of the locale affected

LC_ALL

전체 로케일.

LC_COLLATE

C 로케일 데이터 정렬 범주를 선택. strcollstrxfrm의 동작에 영향을줍니다.

LC_CTYPE

문자 처리 기능 (isdigitisxdigit를 제외한 cctype의 모든 기능)과 멀티 바이트 및 와이드 문자 기능에 영향을줍니다.

LC_MONETARY

localeconv에서 반환 한 통화 형식화 정보에 영향을줍니다.

LC_NUMERIC

형식화 된 입력/출력 연산 및 문자열 형식화 함수의 소수점 문자와 localeconv에서 반환하는 비 화폐 정보에 영향을줍니다.

LC_TIME

strftime의 동작에 영향을줍니다.

locale parameter

  • "C": 최소한의 "C" 로케일.
  • "": 현재 환경의 기본 로케일.
  • NULL: 로케일 환경을 변화시키지 않고, 현재 값을 확인할 수 있다.

Simple example

setlocale (LC_ALL, "");
적당한 환경변수를 참조하여 로케일을 설정하고 그 값을 리턴한다. 환경변수를 참조하는 우선순위는 LC_ALL, 그외 카테고리, LANG변수 순이고, 변수값을 알아내면 locale.alias(예를 들어, /usr/share/locale/)를 참조한 후 뒤에서부터 @ . _을 단위로 순서대로 잘라가며 사용가능한 로케일을 찾아낸다.
locale = setlocale (LC_ALL, NULL);
로케일 값을 변경시키지 않고 단지 카테고리에 관한 현재 로케일값을 알아내고자 하기 위해 그 리턴값을 사용하는 예이다.

Example

#include <cstdio>
#include <clocale>
#include <ctime>
#include <cwchar>

int main()
{
    std::setlocale(LC_ALL, "en_US.UTF-8"); // the C locale will be the UTF-8 enabled English
    std::setlocale(LC_NUMERIC, "de_DE");   // decimal dot will be German
    std::setlocale(LC_TIME, "ja_JP");      // date/time formatting will be Japanese
    wchar_t str[100];
    std::time_t t = std::time(nullptr);
    std::wcsftime(str, 100, L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, str);
}

Troubleshooting

warning: setlocale: LC_ALL: cannot change locale

보통 bash 에서 다음과 같은 느낌으로 출력된다:

bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

경고는 시스템이 출력된 로케일을 설정하려고 하지만 (이 경우 "en_US.UTF-8") 해당 로케일이 설치되어 있지 않거나 올바르게 구성되지 않았다는 의미입니다.

현재 시스템에서 사용 가능한 로케일 확인:

locale -a

이를 해결하는 방법은 다음과 같습니다.

Debian/Ubuntu 기반에서 locale-gen 사용 방법:

sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

CentOS/RHEL 기반 시스템에서는 localedef 사용:

sudo localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

dpkg-reconfigure 로 재설정:

sudo dpkg-reconfigure locales

Redhat 계열에서 패키지 설치:

yum install glibc-langpack-en

Debian 계열에서 패키지 설치:

sudo apt install language-pack-en

로케일이 생성되었으나 여전히 오류가 발생한다면, 로케일 환경 변수를 직접 설정할 수 있습니다. 이를 위해 ~/.bashrc 또는 /etc/environment 파일에 다음 줄을 추가하세요:

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

See also

Favorite site

References


  1. Msdn_-_setlocale_and_wsetlocale.pdf 

  2. 로케일(Locale)에 관하여...