최근 수정 시각 : 2022-05-03 17:34:32

ICU(소프트웨어)

International Components for Unicode
ICU 홈페이지(영어)
1. 개요2. 역사3. 내용
3.1. 문자열 처리: char & string3.2. 코드 변환: conversion3.3. 로캘: locale3.4. 날짜와 시간: date/time3.5. 포매팅: formatting3.6. 변환: transform3.7. 순서: collation3.8. 경계 분석: boundary analysis

1. 개요

컴퓨터 소프트웨어에서 유니코드를 다루기 위한 C/ C++, Java용 멀티 플랫폼 오픈 소스 라이브러리. 지원하는 기능들 중 일부분은 다른 라이브러리들에서 더 가볍고 빠르게 지원하는 것들도 있지만(예를 들어 유니코드 코드 변환은 iconv 등), 최신 유니코드 표준을 거의 그대로 100% 지원하는 것을 목표로 하고 있기 때문에, 소프트웨어를 여러 국가의 문자, 언어 체계에 맞게 돌아가도록 하는 국제화(internationalization, globalization)에서 거의 끝판왕 위치를 차지하고 있다. 한글을 제대로 지원하는 서구권에서 만들어진 게임 등을 보면 거의 꼭 들어가 있다. 대표적인 예가 시드 마이어 문명 5.

2. 역사

애플에서 Mac OS를 대체하기 위해 만들던 Taligent OS가 그 시초이다. Taligent 개발을 위해 애플과 IBM이 같이 손 잡고 일하다 Taligent를 IBM에 넘겨 버린 후 Taligent에 있던 유니코드와 국제화 관련 코드들을 따로 빼서 정리한 게 ICU4C(ICU C/C++)가 되었다. 당시 썬 마이크로시스템즈의 Java 팀이 IBM 바로 옆에 위치해 있었는데, 자바에 '유니코드랑 국제화에 도움 좀 주실 수 있나요?'라고 했더니 마침 가지고 있던 걸 주어 ICU4J(Java용 ICU)가 탄생하게 되었다.

그 뒤 1999년 IBM에서는 ICU를 오픈 소스 프로젝트로 전환하여 공개한 후 유니코드 표준이 변경되는 것에 맞추어 지속적으로 업데이트하고 있다.

3. 내용

3.1. 문자열 처리: char & string

문자열의 길이, 인덱스, 위치 등을 다루기 위한 많은 함수들이 있다. Standard C Library에 있는 strlen, strcat 등의 함수는 아스키 코드만을 다루기 위한 함수이지만, 유니코드에 대응되는 함수들을 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)를 사용하는 나라는 많지만 국가에 따라 조금씩 다른 점이 있을 수 있다.
  • 같은 한글이라도 대한민국 표준어의 문자 순서와 북한 문화어의 문자 순서가 다르다.
이렇듯 같은 글자나 언어라도 사용되는 국가에 따라 다른 처리가 필요한 경우, 아니면 반대로 한 국가에서 여러 가지 공식 언어나 공식 문자가 있는 경우 처리를 달리하기 위해 locale을 정의한 뒤 이를 바탕으로 문자열 처리 등을 해야 한다.

3.4. 날짜와 시간: date/time

각종 날짜와 시간을 다루는 함수들. Standard C Library 등에 있는 날짜/시간 함수의 유니코드 대응은 물론 좀 더 다양하고 강력한 기능들을 제공해 준다.
  • 그레고리안 달력(태양력) 음력은 물론 페르시아력, 인도력, 에티오피아력 등 전 세계에서 사용되는 거의 대부분의 달력과 서로 간의 날짜 변환을 지원해 준다.
  • 각국의 로컬 시간 ↔ UTC 변환 기능

3.5. 포매팅: formatting

  • 각국 통화 기호 표시
  • 각종 날짜와 시간을 로캘에 맞게 문자열로 변환해 주는 기능: 2015/5/15를 한국식으로 표현해 달라고 하면 2015년 5월 15일으로, 미국식으로 표현해 달라고 하면 May 15, 2015로 돌려주는 등.

3.6. 변환: transform

  • 각국 언어의 대소문자 변환, title case(단어의 첫 문자는 대문자, 나머지는 소문자)
  • Bidi 알고리즘. 아랍어, 히브리어 등의 문자는 오른쪽에서 왼쪽으로 쓴다. 물론 컴퓨터 내부에 저장되는 문자열은 다른 글자들과 마찬가지로 똑같이 왼쪽에서 오른쪽으로(정확히는 메모리의 낮은 번지에서 높은 번지로) 저장된다. 문제는 한 문장 내에서 아랍어와 영어를 섞어 쓴다면? 다음 예를 보자.
    • english ARABIC text: 아랍어와 영어가 섞인 문장의 컴퓨터 메모리에서의 저장
    • english CIBARA text: 위 문장을 영어권 국가에서 표현할 때
    • text CIBARA english: 위 문장을 아랍어권 국가에서 표현할 때

    그냥 보기에도 헷갈리지만 아랍어에 익숙하지 않은 사용자가 실제 입력을 할 때나 문장을 편집할 때는 지옥을 맛볼 수 있다. Bidi 알고리즘은 이런 양방향 문장 처리에 대한 처리 방법을 제공한다.

3.7. 순서: collation

각종 언어와 글자에 대한 (정렬할 때의) 순서, 검색 등을 처리한다. 같은 한글도 대한민국 표준어 북한 문화어의 순서가 다르고, 독일어의 경우 사전에서의 순서(of < öf)와 전화번호부에서의 순서(öf < of)가 다르다. 정렬/순서 문서도 참고할 것.

3.8. 경계 분석: boundary analysis

각국 글자의 문자/문자열/문장의 경계가 어디인지를 해당 국가/언어/글자에 따라 분석해 준다.
  • 글자 경계: Ä라는 글자는 유니코드에서 하나의 코드 포인트 혹은 두 개의 코드 포인트로 표현될 수 있다.
  • 단어 경계: 영어의 경우 모든 단어는 띄어쓰기를 하는 원칙이 있기 때문에 간단하지만, 한글로 표현된 한국어만 보더라도 어디까지가 한 단어인지가 모호한 경우가 있다. 아랍어, 태국어 같은 경우는 아예 띄어쓰기가 없기 때문에 모든 글자들이 붙어 있다!
  • 줄 바꿈 경계: 한 문장을 화면에 표시해야 하는데 너무 길어 줄 바꿈을 해야 하는 경우. 단어 단위로 자르면 될 것 같지만 단어 경계와는 또 다르다. 당연하지만 글자/언어/국가에 따라 다 다르다!

프랑스어로 예를 들자면 다음과 같다.
  • |Parlez-|vous |français ?| - 줄 바꿈 경계
  • |Parlez|-|vous| |français| |?| - 단어 경계