목차
ICU 홈페이지 (영어)
1 개요
컴퓨터 소프트웨어 에서 유니코드를 다루기 위한 C/C++, Java 멀티 플랫폼 오픈 소스 라이브러리.
지원하는 기능들 중 일부분 들은 다른 라이브러리들에서 더 가볍고 빠르게 지원하는 것들도 있지만 (예를 들어 unicode 코드 변환은 iconv등등) 최신 유니코드 표준을 거의 그대로 100% 지원하는 것을 목표로 하고 있기 때문에, 소프트웨어를 여러 국가의 문자, 언어 체계에 맞게 돌아가도록 하는 국제화(Internationalization, Globalization)에서 거의 끝판왕적인 위치를 차지하고 있다.
한글을 제대로 지원하는 서구권에서 만들어진 게임등을 보면 거의 꼭 들어가 있다. (대표적인 예가 Sid Meier의 Civilization V)
2 역사
애플(기업)에서 Mac OS를 대체하기 위해 만들던 Taligent OS가 그 시초. Taligent 개발을 위해 애플과 IBM이 같이 손잡고 일하다 Taligent를 IBM에 넘겨 버린후 Taligent에 있던 유니코드와 국제화 관련 코드들을 따로 빼서 정리한게 ICU4C(ICU C/C++)가 되었다.
당시 썬마이크로시스템즈의 Java팀이 IBM 바로 옆에 위치하였는데 자바에 유니코드랑 국제화에 도움좀 주실수 있나요? 라고 했더니 마침 가지고 있던 걸 주어 ICU4J(자바용 ICU)가 탄생하게 되었다.
그 뒤 1999년 IBM에서는 ICU를 오픈 소스 프로젝트로 전환하여 공개한후 유니코드 표준이 변경 되는것에 맞추어 지속적으로 업데이트 하고 있다.
3 내용
3.1 문자열 처리 - Char & String
문자열의 길이, 인덱스, 위치등을 다루기 위한 많은 함수들이 있다. standard c library에 있는 strlen, strcat 등의 함수는 ascii코드만을 다루기 위한 함수이지만 unicode에 대응되는 함수들을 ICU에서 제공하고 있다.
뿐만 아니라 문자/문자열의 속성(알파벳인지 숫자인지 기호인지 등등), 문자열 반복자(iterator), 정규표현식까지도 지원한다.
3.2 코드 변환 - Conversion
ascii, ebcdic은 물론 iso가 정의한 각종 코드들은 물론 UTF-8, UTF-16(LE,BE), UTF-32등등 컴퓨터에서 쓰이는 거의 모든 코드들을 서로 변환해 줄 수 있는 기능을 가지고 있다.
3.3 로케일 - Locale
이 자체로 뭔가 기능을 하지는 않지만 ICU의 다른 기능을 위한 기초 역할을 하는 개념에 가까운 기본 클래스.
언어(Language), 글자(Script), 국가(Country)의 개념을 분리하여 정의하도록 한 뒤 이를 바탕으로 문자열등의 처리 기준을 명확하도록 한다.
예를 들자면
- 같은 알파벳 (Script)과 같은 언어(Language)을 사용하는 나라는 많지만 국가에 따라 조금씩 다른점이 있을 수 있다.
- 인도네시아의 소수민족인 찌아찌아족은 찌아찌아어(Launguage)가 있지만 이를 표기할 글자가 없기 때문에 한글을 공식 문자로 도입했다.
- 같은 한글이라도 대한민국에서의 문자 순서와 북한 문화어에서의 문자 순서가 다르다.
이렇듯 같은 글자나 언어라도 사용되는 국가에 따라 다른 처리가 필요한 경우, 아니면 반대로 한 국가에서 여러가지 공식 언어나 공식 문자가 있는 경우 처리를 달리하기 위해 Locale을 정의한 뒤 이를 바탕으로 문자열 처리등을 해야한다.
3.4 날짜와 시간 - Date/Time
각종 날짜와 시간을 다루는 함수들. standard c library등에 있는 날짜시간 함수의 유니코드 대응은 물론 좀더 다양하고 강력한 기능들을 제공해 준다.
- 그레고리안 달력(태양력)과 음력은 물론 페르시안력, 인도력, 이디오피아력등등 전세계에서 사용되는 거의 대부분의 달력과 서로간의 날짜 변환을 지원해 준다.
- 각국의 로컬시간 <-> UTC 변환 기능
3.5 포맷팅 - Formatting
- 각국 통화 기호 표시
- 각종 날짜와 시간을 로케일에 맞게 문자열로 변환해 주는 기능 - 2015/5/15를 한국식으로 표현해 달라고 하면 2015년 5월 15일으로, 미국식으로 표현해 달라고 하면 15, May, 2015로 돌려주는 등
3.6 변환 - Transform
- 각국 언어의 대소문자 변환, Titlecase(단어의 첫문자는 대문자, 나머지는 소문자)
- Bidi 알고리즘. 아랍어, 히브리어등의 문자는 오른쪽에서 왼쪽으로 쓴다. 물론 컴퓨터 내부에 저장되는 문자열은 다른 글자들과 마찬가지로 똑같이 왼쪽에서 오른쪽으로 (정확히는 메모리의 낮은 번지에서 높은 번지로) 저장된다.
- 문제는 한 문장내에서 아랍어와 영어를 섞어 쓴다면?
- 다음 예를 보자
- english ARABIC text - 아랍어와 영어가 섞인 문장의 컴퓨터 메모리에서의 저장
- english CIBARA text - 위 문장을 영어권 국가에서 표현 할때
- text CIBARA english - 위 문장을 아랍어권 국가에서 표현 할때
- 그냥 보기에도 헷갈리지만 아랍어에 익숙하지 않은 사용자가 실제 입력을 할때나 문장 편집을 할때는 지옥을 맛볼 수 있다. BIDI 알고리즘은 이런 양방향 문장 처리에 대한 처리 방법을 제공한다.
3.7 순서 - Collation
각종 언어와 글자에 대한 (소팅할때의)순서, 검색등을 처리한다.
같은 한글도 대한민국 표준어(ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ)와 북한 문화어의 순서(ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ ㄲ ㄸ ㅃ ㅆ ㅉ ㅇ)가 다르고 독일어의 경우 사전에서의 순서와 전화번호부에서의 순서가 다르다.
3.8 경계 분석 - Boundary Analysis
각국 글자의 문자/문자열/문장의 경계가 어디인지를 해당 국가/언어/글자에 따라 분석해 준다.
- 글자 경계 - Ä 라는 글자는 유니코드에서 하나의 코드 포인트 혹은 두 개의 코드 포인트로 표현할 수 있다.
- 단어 경계 - 영어의 경우 모든 단어는 띄어쓰기를 하는 원칙이 있기 때문에 간단하지만 한글로 표현된 한국어만 보더라도 어디까지가 한단어 인지가 모호하다. 아랍어, 태국어 같은 경우는 아예 띄어쓰기가 없기 때문에 모든 글자들이 붙어 있다!
- 줄바꿈 경계 - 한 문장을 화면에 표시해야 하는데 너무 길어 줄바꿈을 해야 하는 경우. 단어 단위로 자르면 될 것 같지만 단어 경계와는 또 다르다. 당연하지만 글자/언어/국가에 따라 다 다르다!
- 불어의 경우 한 예
- |Parlez-|vous |français ?| - 줄바꿈 경계
- |Parlez|-|vous| |français| |?| - 단어 경계