형식
#include <locale.h>
char *setlocale(int category, const char *locale);
설명
setlocale()
함수는 <locale.h> 포함 파일에서 정의되는 변수를 변경하
거나 쿼리하며 위치를 표시합니다. category의 값은 다음에
나열됩니다.
| 범주 |
용도 |
| LC_ALL |
프로그램의 전체 로케일의 이름을 지정합니다. |
| LC_COLLATE |
strcoll()
및
strxfrm()
함수의 작동에 영향을 줍니다. |
| LC_CTYPE |
문자 처리 함수의 작동에 영향을 줍니다. |
| LC_MONETARY |
localeconv()
및
nl_langinfo()
함수에서 리턴된 화폐 정보에 영향을 줍니다. |
| LC_NUMERIC |
형식화된 입/출력과 스트링 변환 함수 및
localeconv()과
nl_langinfo() 함수로
리턴된 비화폐성 포맷팅 정보를 위한 소수점 문자에 영향을 줍니다. |
| LC_TIME |
strftime()
함수의 작동 및
nl_langinfo()
함수에서 리턴된 시간 포맷팅 정보에 영향을 줍니다. |
| LC_TOD |
시간 함수의 작동에 영향을 줍니다. 범주
LC_TOD에는 여러 필드가 있습니다. TNAME
필드는 시간대 이름입니다. TZDIFF 필드는 로컬 시간과 그리니치 평균시 사이의
차입니다. TNAME 필드에 공백이 없으면, 시간 함수 중 일부로 리턴되는 값을 결정할 때 TZDIFF 필드가 사용됩니다.
이 값은 시스템 값, QUTCOFFSET보다 우선합니다.
|
| LC_UNI_ALL* |
이 범주를 사용하면
setlocale()이 지정된 로케일로부터 모든 LC_UNI_ 범주를 로딩합니다.
이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_COLLATE* |
wcscoll() 및
wcsxfrm() 함수의 작동에 영향을 줍니다.
이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다.
참고: 이 범주는 UCS-2에 지원되지 않습니다.
|
| LC_UNI_CTYPE* |
와이드 문자 처리 함수의 작동에 영향을 줍니다. 이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_MESSAGES* |
_WCS_nl_langinfo()
함수로 리턴된 메세지 포맷팅 정보에 영향을 줍니다. 이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_MONETARY* |
wcslocaleconv() 및
_WCS_nl_langinfo() 함수로 리턴된 화폐 정보에 영향을 줍니다 .
이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_NUMERIC* |
와이드 문자 형식화된 입/출력과 와이드 문자 스트링 변환 함수를 위한 소수점 문자 및
wcslocaleconv()와
_WCS_nl_langinfo() 함수로 리턴된 및 비화폐성 정보에 영향을 줍니다.
이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_TIME* |
wcsftime() 함수의
작동 및 _WCS_nl_langinfo() 함수에서 리턴된 시간 포맷팅 정보에 영향을 줍니다.
이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
| LC_UNI_TOD* |
와이드 문자 시간 함수의 작동에 영향을 줍니다. 이 범주는 UCS-2 또는 UTF-32 CCSID를 가진 로케일만 승인합니다. |
- *
- UNI와 함께 범주를 사용하려면, LOCALETYPE(*LOCALEUCS2)
또는 LOCALETYPE(*LOCALEUTF)은 컴파일 명령에서 지정되어야 합니다.
LOCALETYPE(*LOCALEUCS2)이 사용되면, 지정된 로케일은 UCS-2 로케일이어야 합니다. LOCALETYPE(*LOCALEUTF)가 사용되면, 지정된 로케일은 UTF-32 로케일이어야 합니다.
|
참고: setlocale()
및 기타 로케일에 민감한 C 함수를 정의하는데 두 가지 방법이 있습니다.
setlocale()을 정의하는 원래 방법은 *CLD 로케일 오브젝트를 사용하여 로케일을
설정하고 로케일에 민감한 데이터를 검색하는 것입니다.
setlocale()
을 정의하는 두 번째 방법은 *LOCALE 오브젝트를 사용하여 로케일을
설정하고 로케일에 민감한 데이터를 검색하는 것입니다.
원래 방법은 컴파일 명령에서 LOCALETYPE(*CLD)를 지정하여 액세스됩니다. 두 번째 방법은 컴파일
명령에서 LOCALETYPE(*LOCALE) 또는 LOCALETYPE(*LOCALEUCS2) 또는 LOCALETYPE(*LOCALEUTF)를
지정하여 액세스됩니다.
ILE C에서 로케일 정의의 두 개의 메소드에 대한 자세한 정보는 ILE
C/C++ Programmer's Guide를 참조하십시오.
*CLD 로케일 오브젝트를 사용하는 Setlocale
locale의 값을 "C",
"", LC_C, LC_C_GERMANY, LC_C_FRANCE,
LC_C_SPAIN, LC_C_ITALY, LC_C_USA 또는
LC_C_UK로 설정할 수 있습니다.
"C"의 locale 값은 기본 C 환경을 표시합니다. ""의 locale 값은
setlocale()
함수에 구현의 기본 로케일을 사용하도록 명령합니다.
*LOCALE 오브젝트를 사용하는 Setlocale
locale의 값을 "", "C",
"POSIX",
또는 큰따옴표로 둘러싸인 *LOCALE 오브젝트의 완전한 통합 파일 시스템
경로 이름을 설정할 수 있습니다. "C" 또는 "POSIX"의 locale 값은 기본
C *LOCALE 오브젝트를 표시합니다. ""의 locale 값은
setlocale()
함수에 프로세스의 기본 로케일을 사용하도록 명령합니다.
프로세스의 기본 로케일은 다음 테이블을 사용하여 판별됩니다.
| 범주 |
기본 로케일 |
| LC_ALL |
- LC_ALL 환경 변수를 확인합니다1. 정의되고 널이 아닌 경우, 모든
POSIX 로케일 범주에 대해 지정된 locale2를 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- 각 POSIX 로케일 범주(LC_CTYPE, LC_COLLATE, LC_TIME, LC_NUMERIC, LC_MESSAGES,
LC_MONETARY 및 LC_TOD)의 경우, 동일한 이름의 환경 변수를 확인합니다1. 정의되고
널이 아닌 경우 지정된 로케일을 사용합니다2. 그렇지 않으면 다음 단계로
이동하십시오.
- LANG 환경 변수를 확인합니다1. 이전 단계에서 설정하지 않은 모든
로케일 범주의 경우, LANG 환경 변수가 정의되고 널이 아닌 경우 로케일 범주를 지정된 로케일로 설정합니다2. 그렇지 않으면, 기본 C *LOCALE 오브젝트에 설정하십시오.
|
LC_CTYPE
LC_COLLATE
LC_TIME
LC_NUMERIC
LC_MESSAGES
LC_MONETARY
LC_TOD
|
- LC_ALL 환경 변수를 확인합니다1. 정의되고 널이 아닌 경우 지정된
로케일을 사용합니다2. 그렇지 않으면 다음 단계로
이동하십시오.
- 지정된 로케일 범주와 같은 이름1의 환경 변수를 확인하십시오. 정의되고
널이 아닌 경우 지정된 로케일을 사용합니다2. 그렇지 않으면 다음 단계로
이동하십시오.
- LANG 환경 변수를 확인합니다1. 정의되고
널이 아닌 경우 로케일 범주를 지정된 로케일로 설정합니다2.
그렇지 않으면 다음 단계로
이동하십시오.
- 로케일 범주를 기본 C
*LOCALE
오브젝트에 설정합니다.
|
| LC_UNI_ALL |
사용자 모듈을 LOCALETYPE(*LOCALEUCS2)
옵션으로 컴파일하면:
- LC_UCS2_ALL 환경 변수를 확인합니다1. 정의되고 널이 아닌 경우, 모든 유니코드 로케일 범주에 대해 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- 각 유니코드 로케일 범주의 경우, 해당 환경 변수1
(LC_UCS2_CTYPE, LC_UCS2_COLLATE, LC_UCS2_TIME,
LC_UCS2_NUMERIC, LC_UCS2_MESSAGES, LC_UCS2_MONETARY 또는
LC_UCS2_TOD)를 확인합니다3.
정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- 기본 UCS-2 *LOCALE 오브젝트로 로케일 범주를 설정하십시오.
사용자 모듈을 LOCALETYPE(*LOCALEUTF) 옵션으로 컴파일되면:
- LC_UTF_ALL 환경 변수를 확인합니다1. 정의되고 널이 아닌 경우, 모든 유니코드 로케일 범주에 대해 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- 각 유니코드 로케일 범주의 경우, 해당 환경 변수1 (LC_UTF_CTYPE, LC_UTF_COLLATE, LC_UTF_TIME, LC_UTF_NUMERIC,
LC_UTF_MESSAGES, LC_UTF_MONETARY 또는 LC_UTF_TOD)를 확인합니다3. 정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- LANG 환경 변수를 확인합니다1. 이전 단계에서 설정하지 않은 모든
로케일 범주의 경우, LANG 환경 변수가 정의되고 널이 아닌 경우 로케일 범주를 지정된 로케일로 설정합니다. 그렇지 않으면, 기본 UTF *LOCALE 오브젝트로 설정하십시오.
|
LC_UNI_CTYPE
LC_UNI_COLLATE
LC_UNI_TIME
LC_UNI_NUMERIC
LC_UNI_MESSAGES
LC_UNI_MONETARY
LC_UNI_TOD
|
사용자 모듈을 LOCALETYPE(*LOCALEUCS2)
옵션으로 컴파일하면:
- 지정된 로케일 범주에 해당하는 환경 변수를 확인합니다1 (LC_UCS2_CTYPE, LC_UCS2_COLLATE, LC_UCS2_TIME,
LC_UCS2_NUMERIC, LC_UCS2_MESSAGES, LC_UCS2_MONETARY 또는
LC_UCS2_TOD)3.
정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- LC_UCS2_ALL 환경 변수를 확인합니다1. 정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- 로케일 범주를 기본 UCS-2 *LOCALE
오브젝트로 설정합니다.
사용자 모듈을 LOCALETYPE(*LOCALEUTF) 옵션으로 컴파일하면:
- 지정된 로케일 범주에 해당하는 환경 변수를 확인합니다1 (LC_UTF_CTYPE, LC_UTF_COLLATE, LC_UTF_TIME,
LC_UTF_NUMERIC, LC_UTF_MESSAGES, LC_UTF_MONETARY 또는
LC_UTF_TOD)3.
정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- LC_UTF_ALL 환경 변수를 확인합니다1. 정의되고
널이 아닌 경우 지정된 로케일을 사용합니다. 그렇지 않으면 다음 단계로
이동하십시오.
- LANG 환경 변수를 확인합니다1. LANG 환경 변수가 정의되고 널이 아닌 경우 로케일 범주를 지정된 로케일로 설정합니다. 그렇지 않으면, 기본 UTF *LOCALE 오브젝트로 설정하십시오.
|
참고: 1 로케일 범주에 해당되는 이름을 가진 환경 변수를 사용자가 작성합니다. 다음 중 하나를
위한 로케일 경로명을 지정할 때 LANG 환경 변수는 자동으로 작업 개시 동안 작성됩니다.
로케일 환경 변수는 양식
/QSYS.LIB/<locname>.LOCALE 또는
/QSYS.LIB/<libname>.LIB/<locname>.LOCALE의
로케일 경로명을 포함할 것으로 예상합니다.
사용자 모듈을 LOCALETYPE(*LOCALEUTF) 옵션으로 컴파일되면, 경로의
<locname>
부분이 8 문자를 초과하면 환경 변수는 무시됩니다. 2 문자 접미부가 해당 UTF 로케일의 이름을
얻으려면 로케일 이름에 추가되어야 하므로 이 제한사항이 존재합니다.
참고: 2
LOCALETYPE(*LOCALEUTF)가 컴파일 명령에서 지정되면,
setlocale() 함수는 후행
_8을 LC_ALL,
LC_CTYPE, LC_COLLATE,
LC_TIME, LC_NUMERIC, LC_MESSAGES, LC_MONETARY, LC_TOD 및 LANG
환경 변수에 추가합니다. 이 로케일을 찾을 수 없는 경우, UTF 기본 로케일 오브젝트가 사용됩니다. 예를 들면,
LANG이
/QSYS.LIB/EN_US.LOCALE로 설정되어
setlocale()은 로케일
/QSYS.LIB/EN_US_8.LOCALE을
로딩하려고 하는 경우
setlocale(LC_ALL, "")입니다.
LANG 환경 변수가 Unicode 로케일 범주(LC_UNI_ALL, LC_UNI_CTYPE, LC_UNI_COLLATE,
LC_UNI_TIME, LC_UNI_NUMERIC, LC_UNI_MESSAGES, LC_UNI_MONETARY 또는 LC_UNI_TOD)
중 하나를 설정하는데 사용되면,
setlocale()은 환경 변
수에 저장된 로케일 이름에 후행
_4를 추가합니다. 해당 UTF-32 로케일을 찾으려는
시도입니다.
이 로케일을 찾을 수 없는 경우, 기본 UTF-32 로케일 오브젝트가 사용됩니다. 예를 들면,
LANG이
/QSYS.LIB/EN_US.LOCALE로 설정되어
setlocale()은 로케일
/QSYS.LIB/EN_US_4.LOCALE을
로딩하려고 하는 경우
setlocale(LC_UNI_TIME, "")입니다.
_4 및
_8로 끝나는 로케일 이름은 CCSID(*UTF)로
작성된 로케일의 경우 CRTLOCALE CL 명령에서 소개된 이름 변환을 따릅니다(Information Center에서
CRTLOCALE(Create
Locale) 명령 정보 참조).
참고: 3 LC_UNI_ALL,
LC_UNI_COLLATE, LC_UNI_CTYPE, LC_UNI_TIME, LC_UNI_NUMERIC, LC_UNI_MESSAGES,
LC_UNI_MONETARY 및 LC_UNI_TOD 로케일 범주 이름은 UCS-2 및 UTF 사이에서 공유됩니다. 이
범주에 해당되는 환경 변수를 공유할 수 없으므로 환경 변수의 이름은 로케일 범주 이름과 정확하게 일치하지 않습니다.
UCS-2 환경 변수 이름의 경우, UNI는 UCS2로 대체됩니다(예를 들어,
LC_UNI_ALL 로케일 범주는 LC_UCS2_ALL 환경 변수가 됨). UTF 환경 변수 이름의 경우, UNI는 UTF로 대체됩니다(예를 들어,
LC_UNI_ALL 로케일 범주는 LC_UTF_ALL 환경 변수가 됨).
LOCALETYPE(*LOCALEUCS2) 또는 LOCALETYPE(*LOCALEUTF)로 컴파일하는 경우, 로케일은 LC_UNI_로
시작하는 범주의 유효한 Unicode 로케일에 포인터여야 하고, 다른 범주의 Unicode 로케일이면 안됩니다.
리턴값
setlocale()
함수는 현재 로케일 설정을 나타내는 스트링에 대한 포인터를 리턴합니다.
리턴된 스트링이 저장되면, 저장된 스트링 값은 언제든지 로케일 설정을 복원하기 위해 setlocale()
함수에 대한 입력으로 사용될 수 있습니다. 그러나 스트링을 사용자 지정 버퍼로 복사해야 합니다. 그렇지 않으면, 스트링은 setlocale()에
대한 후속 호출에서 겹쳐쓰여집니다.
참고: setlocale()에
대한 성공적인 호출이 가리키는 스트링이 setlocale()
함수에 대한 후속 호출로 겹쳐쓰여질 수 있으므로, 나중에 사용하려면 스트링을 복사해야 합니다. 로케일 스트링의 정확한 형식은
*CLD,
*LOCALE, *LOCALEUCS2 및 *LOCALEUTF의 로케일 유형 사이에 다릅니다.
로케일을 조회하려면, 두 번째 매개변수로서
NULL을
지정하십시오. 예를 들면, 사용자 로케일의 모든 범주를 조회하려면 다음 명령문을 입력하십시오.
char *string = setlocale(LC_ALL, NULL);
오류 조건
오류 시,
setlocale()
함수는 NULL을 리턴하고 프로그램의 로케일이 변경되지 않습니다.
*CLD 로케일 오브젝트를 사용하는 예
/************************************************************************
This example sets the locale of the program to
LC_C_FRANCE *CLD and prints the string
that is associated with the locale. This example must be compiled with
the LOCALETYPE(*CLD) parameter on the compilation command.
************************************************************************/
#include <stdio.h>
#include <locale.h>
char *string;
int main(void)
{
string = setlocale(LC_ALL, LC_C_FRANCE);
if (string != NULL)
printf(" %s \n",string);
}
*LOCALE 오브젝트를 사용하는 예
/************************************************************************
This example sets the locale of the program to be "POSIX" and prints
the string that is associated with the locale. This example must be
compiled with the LOCALETYPE(*LOCALE) parameter on the CRTCMOD or
CRTBNDC command.
************************************************************************/
#include <stdio.h>
#include <locale.h>
char *string;
int main(void)
{
string = setlocale(LC_ALL, "POSIX");
if (string != NULL)
printf(" %s \n",string);
}