국제 언어 환경 설명서

2장 일반 국제화 기능

이 절은 Solaris 9 환경에 포함된 여러 국제화 기능에 대해 다룹니다.

코드 세트 독립 지원

EUC는 Extended UNIX Code의 축약입니다. Solaris 9 운영 환경은 일본의 PC-Kanji(Shift_JIS로 더 잘 알려짐), 대만의 Big5, 중화인민공화국의 GBK와 같은 비EUC 인코딩을 지원합니다. 대규모 컴퓨터 시장이 비EUC 코드 세트 지원을 요구하기 때문에 Solaris 9 환경은 EUC와 비EUC 코드 세트 지원을 모두 가능하게 하는 견고한 프레임워크를 제공합니다. 이 지원을 코드 세트 독립 또는 CSI라고 합니다.

CSI의 목적은 Solaris 운영 환경 라이브러리와 명령으로부터, 특정한 코드 세트나 인코딩 메소드에 대한 의존성을 제거하는데 있습니다. CSI 아키텍처는 Solaris 운영 환경이 어떤 종류의 UNIX 파일 시스템에서도 사용할 수 있는 인코딩 방식을 지원하도록 해 줍니다. CSI는 UTF-8, PC-Kanji 및 Big5와 같은 많은 새 코드 세트를 지원합니다.

CSI 접근 방법

CSI는 응용프로그램 및 플랫폼 소프트웨어 개발자가 UTF-8 같은 모든 인코딩과 무관하게 코드를 작성할 수 있도록 해 주며, 또한 소스 코드를 수정하지 않고서도 새로운 인코딩 방식을 적용할 수 있도록 해 줍니다. 이러한 아키텍처는 Java의 경우 응용프로그램이 UTF-16에 의존적이라는 점에서 JavaTM 국제화와는 다른 접근 방식을 갖습니다.

많은 기존 국제화된 응용프로그램(예를 들어, Motif)이 기본 시스템에서 자동으로 CSI 지원을 상속합니다. 이러한 응용프로그램은 수정 없이 새 로켈에서 작동합니다.

CSI는 본질적으로 모든 코드 세트로부터 독립적입니다. 그러나 파일 코드 인코딩(코드 세트)에 대한 다음 가정이 Solaris 9 환경에 적용됩니다.

CSI화 된 명령

이 절은 Solaris 9 환경의 CSI화 된 명령을 나열합니다. 각 명령어의 설명서 페이지에는 명령이 CSI화 되었는지를 나타내는 속성 부분이 있습니다.

모든 명령은 특별히 표시되지 않는 한, /usr/bin 디렉토리에 있습니다.

Solaris 9 CSI화 된 라이브러리

libc(/usr/lib/libc.so )의 거의 모든 함수가 CSI화 되었습니다. 그러나 libc의 다음 함수는 EUC 종속 함수이기 때문에 CSI화 되지 않았습니다.

Solaris 9 제품에서 libgen /usr/ccs/lib/libgen.a libcurses /usr/ccs/lib/libcurses.a 는 국제화되었지만 CSI화 되지 않았습니다.

로켈 데이터베이스

로켈 데이터베이스는 Solaris 운영환경 내부적인 것이며, 이후 릴리스에서 변경될 수 있습니다. 그러므로 국제화된 응용프로그램을 개발할 때는, 로켈 데이터베이스를 직접 액세스하지 마십시오. 대신, libc의 국제화 API 에서 설명된 libc 의 국제화 API 를 사용하십시오.


주 –

Solaris 9 환경으로 작업할 때 Solaris 9 제품에 포함된 로켈 데이터베이스를 사용하십시오. 이전 Solaris 버전의 로켈을 사용하지 마십시오.


프로세스 코드 형식

Solaris 9 제품에서 'wide-character'로 알려져 있는 프로세스 코드 형식은 Solaris 운영환경 내부적인 것이며 향후 릴리스에서 변경될 것입니다. 따라서, 국제화된 응용프로그램을 개발할 때 프로세스 코드 형식이 동일하다고 가정하지 마십시오. 대신 libc의 국제화 API 에서 설명된 libc 의 국제화 API 를 사용하십시오.


주 –

모든 유니코드의 프로세스 코드는 UTF-32 표현에 있습니다. UTF-32에 대한 자세한 내용은 The Unicode Consortium의 “Unicode Standard Annex #19: UTF 32” 및 “Unicode Standard Annex #27: Unicode 3.1”, 또는 http://www.unicode.org/를 참조하십시오.


멀티바이트 지원 환경

중국어, 일본어 또는 한국어 문자와 같은 멀티바이트 문자는 단일 바이트로 저장할 수 없는 문자입니다. 이러한 문자는 기억 장치의 2, 3 또는 4바이트가 필요합니다. 더 정확한 정의는 ISO/IEC 9899:1990 부속 절 3.13에서 찾을 수 있습니다.

추가된 새 국제화 기능, ISO/IEC 9899:1990라고도 하는 ANSI C에 대한 개정 1은 일괄하여 멀티바이트 지원 환경(MSE)이라고도 합니다. 개정 1은 상태가 있는 멀티바이트 코드 세트와 더 나은 와이드캐릭터 처리 지원을 위한 추가 국제화 API를 정의합니다.

프로그래밍 모델은 멀티바이트 문자가 논리 장치에서 읽히고 내부적으로 넓은 문자로 저장 가능하게 합니다. 넓은 문자는 프로그램에 의해 그 자체로 논리적 엔티티로 처리될 수 있습니다. 최종적으로 이 넓은 문자는 적절한 변환을 거쳐 논리적 단위로 외부장치로 쓰여질 수 있습니다.

절차는 단일바이트 문자가 읽히고 조작되며 재작성되는 방식과 유사합니다. MSE는 프로그램이 단일바이트 문자에 사용되는 동일한 프로그래밍 모델을 사용하여 멀티바이트 문자를 처리하도록 작성 가능하게 합니다.

동적으로 링크된 응용프로그램

Solaris 9 제품 사용자는 동적 연결 또는 정적 연결을 사용하여 libc와 같은 시스템 라이브러리와 응용프로그램을 연결하는 방법을 선택할 수 있습니다. 시스템 라이브러리에 국제화 기능을 필요로 하는 응용프로그램은 동적으로 링크되어야 합니다. 만약 응용프로그램이 정적으로 링크가 되어 있을 경우, setlocale을 호출해서 로켈을 C나 POSIX 이외의 다른 로켈로 설정할 수 없습니다. 정적으로 링크된 응용프로그램은 C 및 POSIX 로켈에서만 작동할 수 있습니다.

기본적으로, 링커 프로그램은 응용프로그램을 동적으로 연결하려고 시도합니다. 링커 및 컴파일러에 대한 명령줄 옵션이 -Bstatic 또는 -dn 사양을 포함하면 응용프로그램이 정적으로 링크될 수 있습니다. 기존 응용프로그램이 /usr/bin/ldd 명령을 사용하여 동적으로 링크되었는지 확인할 수 있습니다.

예를 들어, 다음을 입력하면

% /usr/bin/ldd /sbin/sh

명령은 /sbin/sh 명령이 다음 응답에서 볼 수 있듯이 동적으로 링크된 프로그램이 아님을 나타냅니다.

ldd: /sbin/sh: file is not a dynamic executable or shared object

다음을 입력하면

% /usr/bin/ldd /usr/bin/ls

명령이 다음 메시지를 표시합니다.

libc.so.1 => 	/usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1

이 메시지는 /usr/bin/ls 명령이 두 라이브러리, libc.so.1libdl.so.1과 동적으로 링크되었음을 나타냅니다.

변경된 인터페이스

libwlibintllibc로 이동하여 더 이상 libwlibintl에 없습니다.

공유 객체(shared object)는 기존 응용프로그램에 대한 런타임 호환성을 보장하고, 아카이브와 함께 응용프로그램을 빌드하기 위한 컴파일 환경의 호환성도 제공합니다. 그러나 더 이상 libwlibintl에 프로그램을 링크시키지 말아야 합니다.

필터에 대한 자세한 내용은 Linker and Libraries Guide를 참조하십시오.

다음 목록은 libw의 스터브 시작점을 보여줍니다.

이 보다 짧은 다음 목록은 libintl의 스터브 시작점을 나열합니다.

ctype 매크로

문자 분류 및 문자 변환 매크로는 /usr/include/ctype.h 에서 정의됩니다. Solaris 9 환경은 XPG4가 정의하는 문자 분류 및 변환 의미를 지원하는 ctype 매크로 세트를 제공합니다. 모든 XPG4XPG4.2 응용프로그램이 자동으로 새 매크로에 액세스하려면 다음 조건 중 하나를 충족해야 합니다.

_XOPEN_SOURCE, _XOPEN_VERSION_XOPEN_SOURCE_EXTENDED가 새 ctype 매크로 외에 추가 XPG4 관련 기능을 가져오기 때문에 비XPG4 또는 XPG4.2 응용프로그램은 __XPG4_CHAR_CLASS__를 사용해야 합니다.

해당 ctype 함수도 존재합니다. Solaris 9 환경 함수는 XPG4 의미도 지원합니다. 자세한 내용은 ctype(3C) 설명서 페이지를 참조하십시오.

libc의 국제화 API

Solaris 9 환경은 두 개의 API 세트를 제공합니다.

와이드캐릭터는 논리적 엔티티로서 고정폭의 단위입니다. 따라서, 멀티바이트 문자를 사용할 때처럼 계속해서 문자의 경계를 추적해야 할 필요가 없습니다.

프로그램이 파일로부터 입력을 받을 때 fscanf(3S) 및 fwscanf(3S)와 같은 입력 함수로 직접 파일의 멀티바이트 데이터를 넓은 문자 프로세스 코드로 변환하거나 입력 후 mbtowc(3C) 및 mbsrtowcs(3C)를 사용하여 변환할 수 있습니다. 넓은 문자 형식에서 멀티바이트 문자 형식으로 출력 데이터를 변환하려면 fwprintf(3S) 및 fprintf(3S)와 같은 출력 함수를 사용하거나 출력 후 wctomb(3C) 및 wcsrtombs(3C)와 같은 변환 함수를 적용하십시오.

이 장의 나머지 표는 Solaris 9 제품에 포함된 국제화 API에 대해 설명합니다.

다음 표는 libc의 메시지 처리 함수 API를 설명합니다.

표 2–1 libc의 메시지 처리 함수

라이브러리 루틴 

설명 

catclose()

메시지 카탈로그 닫기 

catgets()

프로그램 메시지 읽기 

catopen()

메시지 카탈로그 열기 

dgettext()

도메인을 지정하여 메시지 카탈로그에서 메시지 얻기 

dcgettext()

도메인과 범주를 지정하여 메시지 카탈로그에서 메시지 얻기 

textdomain()

현재 도메인을 설정 및 질의 

bindtextdomain()

메시지 도메인에 대한 경로 바인드 

gettext()

메시지 데이터베이스에서 텍스트 문자열 검색 

다음 표는 libc의 코드 변환 기능 API를 설명합니다.

표 2–2 libc의 코드 변환

라이브러리 루틴 

설명 

iconv()

코드 변환 

iconv_close()

변환 설명자 할당 해제 

iconv_open()

변환 설명자 할당 

다음 표는 libc의 정규 표현식 API를 설명합니다.

표 2–3 libc의 정규 표현식

라이브러리 루틴 

설명 

regcomp()

정규식 컴파일 

regexec()

정규식 매칭 실행 

regerror()

오류 코드에서 오류 메시지로의 매핑을 제공 

regfree()

regcomp()가 할당한 사용 가능 메모리

fnmatch()

파일 이름 또는 경로 이름 일치 

다음 표는 libc의 넓은 문자 함수 API를 설명합니다.

표 2–4 libc의 넓은 문자 클래스

라이브러리 루틴 

설명 

wctype()

문자 클래스 정의 

wctrans()

문자 매핑 정의 

다음은 libc의 로켈 수정 및 질의를 나열합니다.

표 2–5 libc의 로켈 수정 및 질의

라이브러리 루틴 

설명 

setlocale()

프로그램의 로켈 수정 및 질의 

다음 표는 libc의 로켈 데이터 질의를 나열합니다.

표 2–6 libc의 로켈 데이터 질의

라이브러리 루틴 

설명 

nl_langinfo()

현재 로켈의 언어 및 문화 정보 얻기 

localeconv()

현재 로켈의 통화 및 숫자 형식 정보 얻기 

다음 표는 libc의 문자 분류 함수 API를 설명합니다.

표 2–7 libc의 문자 분류 및 자역

라이브러리 루틴 

설명 

isalpha()

문자가 알파벳인가? 

isupper()

문자가 대문자인가? 

islower()

문자가 소문자인가? 

isdigit()

문자가 숫자인가? 

isxdigit()

문자가 16진수인가? 

isalnum()

문자가 알파벳인가 숫자인가? 

isspace()

문자가 공백인가? 

ispunct()

문자가 구두점인가? 

isprint()

문자가 인쇄 가능한가? 

iscntrl()

문자가 제어 문자인가? 

isascii()

문자가 ASCII 문자인가? 

isgraph()

문자가 가시 문자인가? 

isphonogram()

넓은 문자가 표음 문자인가? 

isideogram()

넓은 문자가 표의 문자인가? 

isenglish()

영어 알파벳의 넓은 문자가 추가 코드 세트에 왔는가? 

isnumber()

넓은 문자가 추가 코드 세트의 숫자인가? 

isspecial()

특수 넓은 문자가 추가 코드 세트에 있는가? 

iswalpha()

넓은 문자가 알파벳인가? 

iswupper()

넓은 문자가 대문자인가? 

iswlower()

넓은 문자가 소문자인가?  

iswdigit()

문자가 숫자인가?  

iswxdigit()

넓은 문자가 6진수인가?  

iswalnum()

넓은 문자가 알파벳 문자인가 숫자인가? 

iswspace()

넓은 문자가 빈 공백인가?  

iswpunct()

넓은 문자가 구두점인가? 

iswprint()

넓은 문자가 인쇄 가능 문자인가? 

iswgraph()

넓은 문자가 가시 문자인가? 

iswcntrl()

넓은 문자가 제어 문자인가? 

iswascii()

넓은 문자가 ASCII 문자인가? 

toupper()

소문자를 대문자로 변환합니다. 

tolower()

대문자를 소문자로 변환합니다. 

towupper()

소문자 넓은 문자를 대문자로 변환합니다. 

towlower()

대문자 넓은 문자를 소문자로 변환합니다. 

towctrans()

넓은 문자 매핑 

다음 표는 libc의 문자 조합 함수 API를 설명합니다.

표 2–8 libc의 문자 조합

라이브러리 루틴 

설명 

strcoll()

문자열 조합 

strxfrm()

비교를 위해 문자열 변환 

wcscoll()

넓은 문자열 조합 

wcsxfrm()

비교를 위해 넓은 문자열 변환 

다음 표는 libc의 통화 처리 함수 API를 설명합니다.

표 2–9 libc의 통화 형식

라이브러리 루틴 

설명 

localeconv()

현재 로켈의 통화 형식 정보 얻기 

strfmon()

통화 값을 문자열 표현으로 변환 

다음 표는 libc의 날짜 및 시간 형식을 설명합니다.

표 2–10 libc의 날짜 및 시간 형식

라이브러리 루틴 

설명 

getdate()

사용자 형식 날짜 및 시간을 변환 

strftime()

날짜 및 시간을 문자열 표현으로 변환 %u 변환 함수는 X/Open CAE Specification, System Interfaces and Headers, Issue 4, 버전 2를 준수합니다. 이 함수는 10진수 [1,7]로 주일을 표현하고 1이 현재 월요일을 나타냅니다.

strptime()

날짜 및 시간 변환 

다음 표는 libc의 멀티바이트 처리 함수 API를 설명합니다.

표 2–11 libc의 멀티바이트 처리

라이브러리 루틴 

설명 

btowc()

단일바이트를 넓은 문자로 변환 

mbrlen()

문자의 바이트 수 얻기(다시 시작 가능) 

mbsinit()

변환 객체 상태 결정 

mbrtowc()

문자를 넓은 문자 코드로 변환(다시 시작 가능) 

mbsrtowcs()

문자열을 넓은 문자열로 변환(다시 시작 가능) 

mblen()

문자의 바이트 수 얻기 

mbtowc()

문자를 넓은 문자 코드로 변환 

mbstowcs()

문자열을 넓은 문자열로 변환 

다음 표는 libc의 넓은 문자 및 문자열 처리를 설명합니다.

표 2–12 libc의 넓은 문자 및 문자열 처리

라이브러리 루틴 

설명 

wcsncat()

넓은 문자를 길이 n으로 연결

wsdup()

넓은 문자열 중복 

wcscmp()

넓은 문자열 비교 

wcsncmp()

넓은 문자를 길이 n과 비교

wcscpy()

넓은 문자열 복사 

wcsncpy()

넓은 문자를 길이 n으로 복사

wcschr()

넓은 문자열에서 문자 찾기 

wcsrchr()

오른쪽부터 넓은 문자열에서 문자 찾기 

wcslen()

 넓은 문자열 길이 얻기

wscol()

넓은 문자열의 표시 너비 반환 

wcsspn()

다른 넓은 문자열에 있는 하나의 넓은 문자열 범위 반환 

wcscspn()

다른 넓은 문자열에 없는 하나의 넓은 문자열 범위 반환 

wcspbrk()

다른 넓은 문자열에 없는 하나의 넓은 문자열 포인터 반환 

wcstok()

넓은 문자열을 통해 토큰 이동 

wscwcs()

넓은 문자열에서 문자열 찾기 

wcstombs()

넓은 문자열을 멀티바이트 문자열로 변환 

wctomb()

넓은 문자를 멀티바이트 문자로 변환 

wcwidth()

넓은 문자의 열 위치 수 결정 

wcswidth()

넓은 문자열의 열 위치 수 결정 

wctob()

넓은 문자를 단일바이트로 변환 

wcrtomb()

넓은 문자를 문자로 변환(다시 시작 가능) 

wcstol()

넓은 문자열을 긴 정수로 변환 

wcstoul()

넓은 문자열을 부호없는 긴 정수로 변환 

wcstod()

넓은 문자열을 배정도로 변환 

wcsrtombs()

넓은 문자열을 문자열로 변환(다시 시작 가능) 

wcscat()

넓은 문자열 연결 

다음 표는 libc의 형식화된 넓은 문자 입출력을 설명합니다.

표 2–13 libc의 형식화된 넓은 문자 입출력

라이브러리 루틴 

설명 

  

wsprintf()

형식에 따라 넓은 문자열 생성 

wsscanf()

형식화된 입력 변환 

fwprintf()

형식화된 넓은 문자 출력 인쇄 

fwscanf()

형식화된 넓은 문자 입력 변환 

wprintf()

형식화된 넓은 문자 출력 인쇄 

wscanf()

형식화된 넓은 문자 입력 변환 

swprintf()

형식화된 넓은 문자 출력 인쇄 

swscanf()

형식화된 넓은 문자 입력 변환 

vfwprintf()

stdarg 인자 목록의 넓은 문자 형식화된 출력

vswprintf()

stdarg 인자 목록의 넓은 문자 형식화된 출력

이 표는 libc의 넓은 문자열 함수 API를 설명합니다.

표 2–14 넓은 문자열libc

라이브러리 루틴 

설명 

wscasecmp()

넓은 문자열을 비교하고 대소문자 차이를 무시 

wsncasecmp()

코드 문자열 작업 프로세스 

wcsstr()

넓은 문자열 부속 문자열 찾기 

wmemchr()

메모리의 넓은 문자 찾기 

wmemcmp()

메모리의 넓은 문자 비교 

wmemcpy()

메모리의 넓은 문자 복사 

wmemmove()

겹친 영역이 있는 메모리의 넓은 문자 복사 

wmemset()

메모리의 넓은 문자 설정 

다음 표는 libc의 넓은 문자 입출력을 설명합니다.

표 2–15 libc의 넓은 문자 입출력

라이브러리 루틴 

설명 

fgetwc()

스트림에서 멀티바이트 문자를 얻어 넓은 문자로 변환 

getwchar()

stdin에서 멀티바이트 문자를 얻어 넓은 문자로 변환

fgetws()

스트림에서 멀티바이트 문자열을 얻어 넓은 문자로 변환 

getws()

stdin에서 멀티바이트 문자열을 얻어 넓은 문자로 변환

fputwc()

넓은 문자열을 멀티바이트 문자로 변환하여 스트림에 넣기 

fwide()

스트림 방향 설정 

putwchar()

넓은 문자열을 멀티바이트 문자로 변환하여 stdin에 넣기

fputws()

넓은 문자를 멀티바이트 문자열로 변환하여 스트림에 넣기 

putws()

넓은 문자를 멀티바이트 문자열로 변환하여 stdin에 넣기

ungetwc()

넓은 문자를 입력 스트림으로 푸시백 

genmsg 유틸리티

genmsg 유틸리티는 catgets() 계열의 함수들이 사용할 수 있는, 국제화된 소스 메시지 카탈로그를 만드는데 사용됩니다. 유틸리티는 catgets의 함수에 대한 호출을 위해 소스 프로그램 파일을 조사하고 찾은 정보에서 소스 메시지 카탈로그를 구축합니다. 예를 들어, 다음과 같습니다.

% cat example.c
	...
	/* NOTE: %s is a file name */
	printf(catgets(catd, 5, 1, "%s cannot be opened."));
	/* NOTE: "Read" is a past participle, not a present
 
			tense verb */
	printf(catgets(catd, 5, 1, "Read"));
	...
% genmsg -c NOTE example.c
The following file(s) have been created.
			new msg file = "example.c.msg"
% cat example.c.msg
$quote "
$set 5
1			"%s cannot be opened"
	/* NOTE: %s is a file name */
2			"Read"
	/* NOTE: "Read" is a past participle, not a present
			tense verb */

위 예제에서, genmsg를 소스 파일 example.c에 실행하여, example.c.msg라는 소스 메시지 카탈로그를 생성해 냈습니다. 인자 NOTE를 옵션 -c와 함께 사용하여 genmsg가 카탈로그 안에 주석을 포함하도록 합니다. 소스 프로그램의 주석이 지정된 문자열을 포함하면 주석은 메시지 카탈로그에서 catgets에 대한 호출에서 추출된 다음 문자열 후에 나타납니다.

genmsg를 사용하여 메시지 세트에서 메시지를 자동으로 번호 매길 수 있습니다.

자세한 내용은 genmsg(1) 설명서 페이지를 참조하십시오.

형식화된 메시지 카탈로그 파일을 생성하려면 gencat (1) 유틸리티를 사용하십시오.

이식 가능 메시지 파일(.po 파일)에 대한 메시지 추출 유틸리티와 .po 파일에서 메시지 객체 파일(.mo 파일)을 생성하는 방법에 대한 자세한 내용은 각각 xgettext(1)msgfmt(1) 설명서 페이지를 참조하십시오.

사용자 정의 및 사용자 확장 가능 코드 변환

Solaris 사용자는 geniconvtbl 유틸리티를 사용하여 사용자 정의 코드 세트 변환기를 작성할 수 있습니다.

이 유틸리티는 iconv(1)과 iconv(3C)와 같은 표준 시스템 유틸리티와 인터페이스로 사용자 정의 및 사용자 정의 가능 코드 세트 변환을 할 수 있습니다. 이 기능은 응용프로그램이 호환되지 않는 데이터 유형, 특히 독점 소유 또는 구형 응용프로그램의 데이터를 처리하는 능력을 향상시킵니다. 기존 Solaris 코드 세트 변환에 대한 수정도 지원됩니다.

자세한 내용과 예제는 geniconvtbl (1)geniconvtbl(4) 설명서 페이지에서 찾을 수 있습니다. 유틸리티에 대한 예제 입력 소스 파일은 /usr/lib/iconv/geniconvtbl/srcs/ 디렉토리의 참조로도 사용 가능합니다.

사용자 정의 코드 변환이 준비되고 geniconvtbl(1) 설명서 페이지에서 지정된대로 배치되면 사용자는 32비트 및 64비트 Solaris 운영 환경의 iconv(1) 유틸리티 및 iconv(3C) 함수의 코드 변환을 사용할 수 있습니다.