C:setlocale
런타임 로캘을 설정하거나 가져옵니다.
Category
영향을받는 로케일의 일부입니다. clocale에서 매크로로 정의 된 다음 상수 값 중 하나입니다.
value | Portion of the locale affected |
LC_ALL | 전체 로케일. |
LC_COLLATE | C 로케일 데이터 정렬 범주를 선택. strcoll 및 strxfrm의 동작에 영향을줍니다. |
LC_CTYPE | 문자 처리 기능 (isdigit 및 isxdigit를 제외한 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
- ubuntu - Linode Lish bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) - Stack Overflow
- Linux 에서 로캘 에러 "warning: setlocale: LC_ALL: cannot change locale" 처리
보통 bash 에서 다음과 같은 느낌으로 출력된다:
경고는 시스템이 출력된 로케일을 설정하려고 하지만 (이 경우 "en_US.UTF-8") 해당 로케일이 설치되어 있지 않거나 올바르게 구성되지 않았다는 의미입니다.
현재 시스템에서 사용 가능한 로케일 확인:
이를 해결하는 방법은 다음과 같습니다.
Debian/Ubuntu 기반에서 locale-gen 사용 방법:
CentOS/RHEL 기반 시스템에서는 localedef 사용:
dpkg-reconfigure 로 재설정:
Redhat 계열에서 패키지 설치:
Debian 계열에서 패키지 설치:
로케일이 생성되었으나 여전히 오류가 발생한다면, 로케일 환경 변수를 직접 설정할 수 있습니다. 이를 위해 ~/.bashrc
또는 /etc/environment
파일에 다음 줄을 추가하세요:
See also
Favorite site
- MSDN - setlocale, _wsetlocale 1
- 다크 프로그래머 :: setlocale 사용법
- IBM Knowledge Center - setlocale() — 로케일 설정
- Joinc - 리눅스 locale 설정
- [추천] 로케일(Locale)이란 2
References
-
Msdn_-_setlocale_and_wsetlocale.pdf ↩