새소식

언어/C++

c++ locale(로케일) 정리

  • -

저번에 c++의 tolower, toupper 함수를 찾다가
locale 라이브러리에도 위 함수가 있는것을 발견하게 되었습니다
그래서 locale이 어떤 역할을 하는지 무엇인지 궁금하여 찾아보게 된 내용을 정리하였습니다
http://www.cplusplus.com/reference/locale/locale/?kw=locale를 참고하여 정리 하였습니다

locale 이란?

파파고에서 locale 단어의 뜻을찾으면 현장이라는 뜻으로 나옵니다.
즉, 국가, 언어마다 달라지는 내용을 저장해둔 것입니다.
쉽게 이야기 하면 현지화 라이브러리로 보면 될것 같습니다.
나라마다 숫자 포맷팅 방식 듣 여러 표현하는 방식이 다르기 때문에 이를 표현하기 위한 라이브러리로 보면 됩니다

A locale is a set of features that are culture-specific, which can be used by programs to be more portable internationally.

locale class

c++에는 locale 관련 설정이 std::locale 클래스를 통해서 관리되고 있습니다
locale을 구성할때 localization engine은 locale object와 관련된 facet들을 초기화 하여 프로그램에서 사용할 수 있게 합니다.(일반적으로 프로그램에서 local로 생성되지 않음)
locale은 facet(패싯)들 정보를 저장하여 이를 가지고 국제화(?)를 한다고 보면 될것 같습니다
특징을 정리하자면

  1. locale 객체는 clocale의 setlocale과 같은 함수에 의해서 구성된다
  2. 둘 이상 locale 객체의 facet을 합칠 수 있다
  3. 모든 프로그램에는 global locale인 하나의 locale이 있습니다.
  4. locale::global을 호출하여 변경할 수 있습니다

locale의 facet

locale 개체는 기능 자체를 멤버 함수로 포함하지 않습니다.
그 대신, locale 개체는 선택한 facet 개체에 대한 정보를 포함하며 특정 기능을 멤버함수로 구현하는 패싯 개체 중 하나입니다.
음.. 쉽게 얘기하면 facet 개체들은 특정 기능들을 구현하고 있으며, 여러 facet 중 하나를 선태해서 가지고 있다는 뜻으로 보입니다.

facet 종류

c++ loccale class의 멤버 변수를 보면 다음을 가지고 있습니다

  • category
  • facet
  • id (facet의 id)

위에서도 이야기했듯이 category로 나누어 facet을 가지고 있다는 것을 알 수 있습니다.
category는 총 6가지로 나뉘어져 있으며 facet의 총 갯수는 12개 입니다.
이 facet에 접근하기 위해서는 use_facet 함수를 이용할 수 있습니다

// numpunct facet의 decimal_point 함수에 접근
const numpunct<char>& myfacet = use_facet < numpunct<char> > (mylocale);
myvar = myfacet.decimal_point();

더 자세한 정보는 c++ locale 헤더를 참고하시기 바랍니다

category facet 설명
collate collate 문자의 순서를 비교하고 해싱하는 것과 관련
ctype ctype 문자의 종류를 구분
  codecvt 문자열 인코딩
monetary moneypunct 화폐와 관련
  money_get 문자열로부터 화폐 파싱
  money_put 화폐를 문자열로 출력
numeric numpunct 숫자와 관련
  num_get 문자열로부터 숫자 파싱
  num_put 숫자를 문자열로 출력 (money_put과 다른 점은 $가 출력되지 않음)
time time_get 문자열로부터 시간을 파싱
  time_put 시간을 문자열로 출력
messages messages 문자열을 국가, 언어에 따라 현지화

 

locale의 사용

int main() {
    locale loc_korean("korean");

	if (isdigit('1', loc_korean)) {
		cout << "Yes" << endl;
	}
	else {
		cout << "NO" << endl;
	}

    return 0;
}

위 처럼 이런식으로 사용하기 위해 필요합니다

한국의 locale을 적용해서 주어진 문자가 숫자가 맞는지 확인할 수 있습니다.

그 외에도 tolower, toupper와 같은 함수를 이요해 locale에 따른 대소문자 변환도 가능합니다

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.