International Components for Unicode
컴퓨터 소프트웨어 에서 유니코드를 다루기 위한 C/C++, Java 멀티 플랫폼 오픈 소스 라이브러리.
지원하는 기능들 중 일부분 들은 다른 라이브러리들에서 더 가볍고 빠르게 지원하는 것들도 있지만 (예를 들어 unicode 코드 변환은 iconv등등) 최신 유니코드 표준을 거의 그대로 100% 지원하는 것을 목표로 하고 있기 때문에, 소프트웨어를 여러 국가의 문자, 언어 체계에 맞게 돌아가도록 하는 국제화(Internationalization, Globalization)에서 거의 끝판왕적인 위치를 차지하고 있다.
한글을 제대로 지원하는 서구권에서 만들어진 게임등을 보면 거의 꼭 들어가 있다. (대표적인 예가 Sid Meier의 Civilization V)
Packages
Package | Contents |
icu-uc | Common (uc) and Data (dt/data) libraries |
icu-i18n | Internationalization (in/i18n) library |
icu-le | Layout Engine |
icu-lx | Paragraph Layout |
icu-io | Ustdio/iostream library (icuio) |
문자열 처리 (Char & String)
문자열의 길이, 인덱스, 위치등을 다루기 위한 많은 함수들이 있다. standard c library에 있는 strlen, strcat 등의 함수는 ascii코드만을 다루기 위한 함수이지만 unicode에 대응되는 함수들을 ICU에서 제공하고 있다. 뿐만 아니라 문자/문자열의 속성(알파벳인지 숫자인지 기호인지 등등), 문자열 반복자(iterator), 정규표현식까지도 지원한다.
icu::UnicodeString
- icu::UnicodeString Class Reference
- Stackoverflow: UnicodeString to char* (UTF-8)
- Stackoverflow: Looking for simple practical C++ examples of how to use ICU
UTF-8 Encoding/Decoding:
-
fromUTF8(const StringPiece &utf8)
-
toUTF8String(StringClass &result)
-
toUTF8(ByteSink &sink)
And extract()
is not prefered now.
코드 변환 (Conversion)
ASCII, EBCDIC은 물론 ISO가 정의한 각종 코드들은 물론 UTF-8, UTF-16(LE,BE), UTF-32등등 컴퓨터에서 쓰이는 거의 모든 코드들을 서로 변환해 줄 수 있는 기능을 가지고 있다.
Example
로케일 (Locale)
이 자체로 뭔가 기능을 하지는 않지만 ICU의 다른 기능을 위한 기초 역할을 하는 개념에 가까운 기본 클래스. 언어(Language), 글자(Script), 국가(Country)의 개념을 분리하여 정의하도록 한 뒤 이를 바탕으로 문자열등의 처리 기준을 명확하도록 한다.
예를 들자면:
- 같은 알파벳 (Script)과 같은 언어(Language)을 사용하는 나라는 많지만 국가에 따라 조금씩 다른점이 있을 수 있다.
- 인도네시아의 소수민족인 찌아찌아족은 찌아찌아어(Launguage)가 있지만 이를 표기할 글자가 없기 때문에 한글을 공식 문자로 도입했다.
- 같은 한글이라도 대한민국에서의 문자 순서와 북한 문화어에서의 문자 순서가 다르다.
이렇듯 같은 글자나 언어라도 사용되는 국가에 따라 다른 처리가 필요한 경우, 아니면 반대로 한 국가에서 여러가지 공식 언어나 공식 문자가 있는 경우 처리를 달리하기 위해 Locale을 정의한 뒤 이를 바탕으로 문자열 처리등을 해야한다.
날짜와 시간 (Date/Time)
각종 날짜와 시간을 다루는 함수들. standard c library등에 있는 날짜시간 함수의 유니코드 대응은 물론 좀더 다양하고 강력한 기능들을 제공해 준다.
- 그레고리안 달력(태양력)과 음력은 물론 페르시안력, 인도력, 이디오피아력등등 전세계에서 사용되는 거의 대부분의 달력과 서로간의 날짜 변환을 지원해 준다.
- 각국의 로컬시간 <-> UTC 변환 기능
포맷팅 (Formatting)
- 각국 통화 기호 표시
- 각종 날짜와 시간을 로케일에 맞게 문자열로 변환해 주는 기능 - 2015/5/15를 한국식으로 표현해 달라고 하면 2015년 5월 15일으로, 미국식으로 표현해 달라고 하면 15, May, 2015로 돌려주는 등
변환 (Transform)
- 각국 언어의 대소문자 변환, Titlecase(단어의 첫문자는 대문자, 나머지는 소문자)
- Bidi 알고리즘. 아랍어, 히브리어등의 문자는 오른쪽에서 왼쪽으로 쓴다. 물론 컴퓨터 내부에 저장되는 문자열은 다른 글자들과 마찬가지로 똑같이 왼쪽에서 오른쪽으로 (정확히는 메모리의 낮은 번지에서 높은 번지로) 저장된다.
순서 (Collation)
각종 언어와 글자에 대한 (소팅할때의)순서, 검색등을 처리한다. 같은 한글도 대한민국 표준어(ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ)와 북한 문화어의 순서(ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ ㄲ ㄸ ㅃ ㅆ ㅉ ㅇ)가 다르고 독일어의 경우 사전에서의 순서와 전화번호부에서의 순서가 다르다.
경계 분석 (Boundary Analysis)
각국 글자의 문자/문자열/문장의 경계가 어디인지를 해당 국가/언어/글자에 따라 분석해 준다.
- 글자 경계 - Ä 라는 글자는 유니코드에서 하나의 코드 포인트 혹은 두 개의 코드 포인트로 표현할 수 있다.
- 단어 경계 - 영어의 경우 모든 단어는 띄어쓰기를 하는 원칙이 있기 때문에 간단하지만 한글로 표현된 한국어만 보더라도 어디까지가 한단어 인지가 모호하다. 아랍어, 태국어 같은 경우는 아예 띄어쓰기가 없기 때문에 모든 글자들이 붙어 있다!
- 줄바꿈 경계 - 한 문장을 화면에 표시해야 하는데 너무 길어 줄바꿈을 해야 하는 경우. 단어 단위로 자르면 될 것 같지만 단어 경계와는 또 다르다. 당연하지만 글자/언어/국가에 따라 다 다르다!
IO
ustdio, ustream
Layout Engine
ICU Data
ICU makes use of a wide variety of data tables to provide many of its services. Examples include converter mapping tables, collation rules, transliteration rules, break iterator rules and dictionaries, and other locale data. Additional data can be provided by users, either as customizations of ICU's data or as new data altogether.
How to compile static icudata
ICU 데이터 라이브러리를 다운받는다
http://apps.icu-project.org/datacustom/
소스코드상에서 다운받은 데이터 라이브러리를 아래의 경로에 위치시킨다.
Run configuration & make:
icupkg.inc
파일이 정상적으로 생성되었는지 확인한다.
WARNING |
위의 |
Manually create
만약 수동으로 c파일을 생성하고 싶다면 아래와 같이 진행하면 된다.
## Extract items from the package:
$ ./bin/icupkg -d ./data/out/build/icudt57l --list -x \* ./data/in/icudt57l.dat -o ./data/out/tmp/icudata.lst
## Produce packaged ICU data from the given list(s) of files:
## if you want to change the temp directory: -T ./data/out/tmp -> -T ./output_temp
$ ./bin/pkgdata -O ./data/icupkg.inc -q -c -s ./data/out/build/icudt57l -d ./lib -e icudt57 -T ./data/out/tmp \
-p icudt57l -m static -r 57.1 -L icudata ./data/out/tmp/icudata.lst
./data/out/tmp
디렉토리에 c파일이 생성되었는지 확인하면 된다.
icupkg.inc
파일을 참고하여 위의 소스코드를 모두 컴파일한 후 정적 컴파일하면 된다.
참고로 아래는 MacOSX에서 생성한 해당 파일의 COMPILE
변수와 LIBFLAGS
변수 부분이다.
COMPILE=clang -DU_ATTRIBUTE_DEPRECATED= -DU_HAVE_ATOMIC=1 -fPIC -std=c99 -Wall -pedantic -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -Qunused-arguments -Wno-parentheses-equality -fno-common -c
LIBFLAGS=-I../common -I../common -dynamic
Documentation
- GettingStartedWithICU_a005_iuc27.ppt.zip
- http://www.icu-project.org/docs/papers/GettingStartedWithICU_a005_iuc27.ppt
See also
Favorite site
- ICU web site
- Docs & Papers
- [추천] Converter Explorer
- [추천] ICU Data Library Customizer
- ICU4C API Reference
- Wikipedia (en) International Components for Unicode
- 나무위키: ICU(소프트웨어)
- ICU의 charset detector…
- ICU(International Components for Unicode) Library static(release, debug) build with MSVC2012 하기
- BSPFP: ICU - International Components for Unicode
- Internationalize and Localize Your C/C++ Code with ICU