다른 나라와 문명은 소통하기 위한 다양한 관습을 갖는다. 이들 관습들은 날짜와 시간을 표현하기 위한 형식처럼 아주 간단한 것에서부터 매우 복잡한 것까지 소통되는 언어의 범위를 갖는다.
소프트웨어의 세계화는 사용자가 좋아하는 관습들에 적응하도록 프로그램 하는 것을 의미한다. ANSI C에서, 세계화는 지역을 가지고 작업된다. 각 지역은 관습들의 집합에서 각 목적을 위해 선택된 한가지 관습을 지정한다. 사용자는 지역을 선택함으로써(환경변수를 거쳐서) 관습의 집합을 선택한다.
모든 프로그램들은 그들의 환경의 일부로써 선택된 지역을 상속받는다. 주어진 프로그램은 선택된 지역에 따라서 만들어졌고, 그들은 사용자에 의해 선택된 관습을 따를 것이다.
각 지역은 다음의 것을 포함해서, 여러 가지 목적을 위한 관습들을 정한다.
정해진 지역에 적응하는 어떤 것은 라이브러리 서브루틴들에 의해 자동적으로 다루어진다. 예를 들어, 선택된 지역의 대조시퀀스를 사용하여 순서대로 맞출 필요가 있는 모든 프로그램들은 비교 문자열에 strcoll 이나 strxfrm을 사용할 수 있다.
지역의 다른 것들은 라이브러리의 이해력 밖에 있다. 예를 들어, 라이브러리는 당신 프로그램의 출력 메시지를 다른 언어로 자동적으로 해석할 수 없다. 사용자가 좋아하는 언어로 출력을 지원하는 유일한 방법은 직접 프로그램 하는 것이다. ( 우리는 이것을 더 쉽게 하기 위한 도구들이 주어지기를 희망한다. )
이 장은 현재의 지역을 갱신할 수 있고, 그것의 메커니즘을 설명한다. 정해진 라이브러리 함수들상에서 현재 지역의 효과들은 각각의 함수들에 대한 설명에서 좀더 상세하게 설명되어진다.
사용자가 한 지역을 선택하기 위한 가장 간단한 방법은 환경변수 LANG를 설정하는 것이다. 이것은 모든 목적을 위해서 사용자에게 단일한 지역을 지정한다. 예를 들어, 한 사용자가 스페인에서 가장 표준인 관습을 사용하기 위해서 `espana-castellano'라고 이름이어진 가상 지역을 선택할 수 있다.
지역들의 집합은 사용자가 사용하고 있는 운영제체에 의존하여 지원되고, 그리고 그들의 이름들을 가지고 작업한다. 우리는 `C' 또는 `POSIX'라고 불리는 표준 지역을위한 것을 제외하고는, 무슨 지역들이 존재할 것인지에 대해서 어느 약속도 할 수 없다. 사용자는 다른 목적으로 다른 지역들을 지정하기 위한 옵션들을 가진다. _실제로, 여러 개의 지역들을 혼합하여 선택한다.
예를 들어, 사용자가 여러 가지 목적을 위해서 지역 `espana-castellano'를 선택하였지만, 통화의 형식을 위해서는 지역 'usa-english'를 선택할 수 있다. 이것은 통화량이 미국 달러로 표현되지만 만일 그 사용자가 스페인에서 일하고 있고, 스페인어를 사용하는 미국인이라면 뜻이 통할 것이다.
모든 지역들처럼 `espana-castellano' 와 `usa-english' 의 두 지역은 어떤 지역들에 적용하기 위한 모든 목적들을 위한 관습을 포함한다. 그렇지만, 사용자는 그들 목적중에서 특정한 몇 가지 목적을 위해서는 다른 지역을 사용하도록 선택할 수 있다.
지역을 제공하는 목적은 범주안에 묶어지므로, 사용자나 프로그램은 독립적으로 각 범주를 위해서 그 지역을 선택할 수 있다. 다음은 범주들의 리스트이다; 각각의 이름은 사용자가 설정할 수 있는 환경변수, 그리고 setlocale에 인수로서 사용할 수 있는 매크로 이름이다.
LC_COLLATE
LC_CTYPE
LC_MONETARY
LC_NUMERIC
LC_TIME
LC_ALL
LANG
C 프로그램은 그 프로그램이 시작할 때 지역 환경변수들을 상속받는다. 이것은 자동적으로 발생한다. 그렇지만, 그들 변수들이 라이브러리 함수들에 의해 사용된 지역은 자동적으로 제어하지 않기 때문에, ANSI C는 모든 프로그램을 디폴트로 표준 `C'지역으로 시작하게 한다. 환경변수에 의해 정해진 지역들을 사용하기 위해서는, 당신은 setlocale을 호출해야만 한다. 그것을 다음과 같이 호출하라.
setlocale (LC_ALL, "");
당신은 또한 일반적으로 사용하거나 또는 정해진 범주를 위한, 특정한 지역을 선택하기 위해서 setlocale를 사용할 수 있다. 이 절에 있는 심볼들은 헤더파일 `locale. h'에 정의되어 있다.
함수 : char *setlocale (int category, const char *locale)
모든 운영체제상에서 당신이 발견할 수 있는 지역의 이름은 오직 다음의 세 가지뿐이다:
"C"
"POSIX"
" "
이름을 가진 지역들을 정의하고 구동하는 것은 보통 당신이 속한 시스템의 시스템관리자의 책임이다(또는 GNU C 라이브러리를 구동했던 사람. ) 어떤 시스템들은 사용자가 지역을 만들도록 허용할 수도 있지만, 우리는 이것에 대해서 논의하지 않겠다.
만일 당신의 프로그램이 `C'지역과는 다른 어떤 것을 사용할 필요가 있다면, 명백하게 어떤 비-표준 지역을 이름으로 지정하기보다는, 환경변수를 통해서 사용자가 정한 지역을 따르도록 한다면 좀 더 이식성이 있는 프로그램이 될 것이다. 다른 기계에서는 자신이 구동한 지역과는 다른 지역들의 집합을 가질지도 모른다는 것을 기억하라.
당신이 현재 지역의 관습을 사용해서 숫자나, 통화량을 형식화하길 원한다면, 그것을 어떻게 형식화할 것인지에 대한 정보를 얻도록 localeconv 함수를 사용할 수 있다. localeconv 함수는 헤더파일 `locale. h'에 선언되어 있다.
함수 : struct lconv * localeconv (void)
데이터 타입 : struct lconv
다음은 struct lconv의 표준 멤버들이다; 다른 것이 있을 수도 있다.
char *decimal_point
char *mon_decimal_point
char *thousands_sep
char *mon_thousands_sep
char *grouping
char *mon_grouping
chart_frac_digits
char frac_digits in
표준 `C'지역에서, 이들 멤버 둘은 모두 "미지정"이라는 의미를 가진 CHAR_MAX 값을 갖는다. ANSI 표준은 당신이 이것을 발견했을 때 그 값으로 무엇을 할 것인지 말하지 않는다. ; 우리는 아무런 소수부가 출력되지 않는 것을 추천한다. ( 이 지역은 또한 mon_decimal_point를 위해 빈 문자열을 지정하는데, 그것은 어느 소수부 숫자들의 출력도 거부됨을 의미한다. )
구조체 struct lconv의 멤버들은 통화 값을 확인하는 심볼들을 어떻게 출력할 것인지를 정한다_미국달러의 표시는 `$'으로 세계적으로 인정한다.
각 나라는 두 개의 표준 통화기호들을 가지고 있다. 지역 통화기호는 그 나라안에서 통상적으로 사용되는것이고, 세계 통화기호는, 명백하게 그 나라를 지정할 필요가 있을 때 그 나라의 통화기호로 나타내기 위해서 국제적으로 사용된다.
예를 들어, 많은 나라들은 그들의 통화단위로 달러를 사용하고, 국제적으로 다른 나라들과 거래를 할 때 미국 달러대신에 캐나달 달러로 거래할것인지 또는 오스트레일리아 달러로 거래할것인지를 정하는 것은 중요하다. 그러나 그 구문이 캐나다가 되도록 정해져있을 때, 달러의 양들은 캐나다 달러로 된다고 가정되므로 이것을 명백하게 만들 필요가 없다.
char *currency_symbol
char *int_curr_symbol
이들 멤버들은 만일 currency_symbol 문자열이 통화량의 값보다 선행하면 1이고, 그 문자열이 값보다 뒤에 나타나면 0이다. p_cs_precedes 멤버는 양의 값(또는 0)에 적용하고, n_cs_precedes 멤버는 음의 값에 적용한다. 표준 `C' 지역에서, 이 멤버 둘 모두는 "미지정"을 의미하는 CHAR_MAX의 값을 갖는다. ANSI 표준은 당신이 이 값을 발견할 때 무엇을 하는지를 말하지 않지만, 우리는 그 값 앞에 통화기호를 출력하기를 권장한다. 대부분의 나라에서 그렇게 사용한다. 즉 그들 멤버 안에 있는 모든 0이 아닌 값들을 유사하게 취급하라.
POSIX 표준은 그들 두 개의 멤버들을 currency_symbol은 물론 int_curr_symbol에도 적용한다. ANSI C 표준은 그들은 오직 currency_symbol에 적용됨을 내포하고 있는 것처럼 보여서_int_curr_symbol은 항상 나타내려는 양(amount)에 선행할 것이다. 우리는 그들이 국제통화기호를 출력하기 위해서 보통의 관습들과 매치될것이라고 짐작할 수 있다. 우리의 나타내려는 양(amount)에 항상 선행할 것이라고 추측한다. 만일 우리가 이해 가능한 답을 발견한다면, 우리는 그것을 그렇게 할 것이다.
그들 멤버들은 currency_symbol 문자열과 양(amount) 사이에 공백이 있으면 1이고 없으면 0이다. p_sep_by_space 멤버는 양의값(또는 0)에 적용되고, n_sep_by_space 멤버는 음의 값에 적용된다. 표준 `C' 지역에서, 이들 멤버 둘 모두는 "미지정"을 의미하는 CHAR_MAX의 값을 갖는다. ANSI 표준은 당신이 이 값들을 발견할 때 당신이 무엇을 할 것인지를 알리지 못한다; 우리는 공백을 출력하는 것 그것을 취급하기를 제안한다. 즉, 그들 멤버 안에 있는 모든 0이 아닌 값들은 유사하게 최급하라. 그들 멤버들은 오직 currency_symbol에 적용된다. 당신이 int_curr_symbol을 사용할 때, 당신은 결코 부가적인 공백을 프린트하지 않는다, 왜냐하면, int_curr_symbol 그 자체는 적당한 분리자를 포함하고 있기 때문이다.
POSIX 표준은 그들 두 개의 멤버들을 currency_symbol 처럼 int_curr_symbol에도 적용한다. 그러나 ANSI C 표준에 있는 예제들은 적당한 분리자를 포함한 int_curr_symbol로 currency_sumbol만이 오직 적용됨을 보여주고 있다_그래서 당신은 결코 부가적인 공백을 프린트하지 않을 것이다. 우리가 현재 알고있는 것에 기초하여, 우리는 당신이 국제 통화기호를 프린트하고 아무런 공백을 프린트하지 않을 때, 그들 멤버들을 무시하기를 권장한다.
구조체 struct lconv의 멤버들은 통화 값의 부호를 어떻게 프린트할 것인지를 지정한다.
char *positive_sign
char *negative_sign
char p_sign_posn
char n_sign_posn
CHAR_MAX
ANSI 표준은 CHAR_MAX 값이 있을 때 당신이 무엇을 해야하는지 말해주지 않는다. 우리는 통화기호 뒤에 부호를 출력하도록 권장한다.
국제적 통화 형식이거나 아닌것에 이들 멤버들의 적용이 당신에게 허용 될 것인지가 명백하지 않다. POSIX는 당신이 그렇게 하도록 하지만, ANSI C 표준에 있는 예제들은 당신이 그렇게 하지 않기를 제안한다. 우리는 통화량의 형식화를 위한 관습을 잘 알고 있는 누군가가 우리가 무엇을 권장할지를 우리에게 말해주기를 희망한다.
목차 이전 18. 확장된 문자들 다음 : 20. 비-지역 탈출