ICU(소프트웨어)

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)의 개념을 분리하여 정의하도록 한 뒤 이를 바탕으로 문자열등의 처리 기준을 명확하도록 한다.
예를 들자면

  1. 같은 알파벳 (Script)과 같은 언어(Language)을 사용하는 나라는 많지만 국가에 따라 조금씩 다른점이 있을 수 있다.
  2. 인도네시아의 소수민족인 찌아찌아족은 찌아찌아어(Launguage)가 있지만 이를 표기할 글자가 없기 때문에 한글을 공식 문자로 도입했다.
  3. 같은 한글이라도 대한민국에서의 문자 순서와 북한 문화어에서의 문자 순서가 다르다.

이렇듯 같은 글자나 언어라도 사용되는 국가에 따라 다른 처리가 필요한 경우, 아니면 반대로 한 국가에서 여러가지 공식 언어나 공식 문자가 있는 경우 처리를 달리하기 위해 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| |?| - 단어 경계