개요
유니코드는 세계 여러 문자와 기호를 컴퓨터에서 일관되게 다루기 위한 국제 문자 표준이다. 문자마다 고유한 번호를 부여하고, 그 번호를 파일에 저장하거나 통신으로 전달하는 방법과 문자 처리 규칙을 함께 정의한다.
유니코드는 특정 글꼴이나 입력기가 아니다. 화면에 글자를 어떤 모양으로 그릴지는 글꼴과 표시 장치가 맡고, 키보드 입력을 문자로 바꾸는 일은 입력기가 맡는다. 유니코드는 그보다 아래에서 서로 다른 운영체제와 프로그램이 같은 문자를 같은 값으로 알아볼 수 있게 공통 기준을 제공한다.
문자와 코드 포인트
코드 포인트는 유니코드가 문자나 기호에 부여한 번호이다. 보통 U+ 뒤에 16진수를 붙여 적는다. 예를 들어 한글 음절 ‘가’는 U+AC00이다. 이 번호는 문자의 모양을 직접 그리는 그림 파일이 아니라, 프로그램이 어떤 문자인지 식별하는 값이다.1
코드 포인트와 파일에 저장되는 바이트는 같은 말이 아니다. UTF-8·UTF-16·UTF-32는 같은 코드 포인트를 바이트나 코드 단위의 배열로 바꾸어 저장하고 전송하는 서로 다른 인코딩 방식이다. 따라서 같은 ‘가’라도 어느 인코딩을 사용했느냐에 따라 파일 안의 바이트열은 달라진다.1
한글과 정규화
유니코드는 현대 한글 11,172음절을 U+AC00부터 U+D7A3까지 미리 조합된 음절로 배치한다. 동시에 초성·중성·종성 자모에도 각각 코드 포인트를 부여한다. 그래서 ‘가’를 U+AC00 하나로 나타낼 수도 있고, 초성 기역 U+1100과 중성 아 U+1161을 이어서 나타낼 수도 있다.2
두 표현은 화면에서 같은 글자로 보일 수 있지만 코드 포인트열은 다르다. 유니코드 정규화는 이렇게 여러 방식으로 표현된 문자열을 비교하거나 일정한 형태로 맞추기 위한 규칙이다. NFC는 가능한 문자를 미리 조합한 형태로 만들고, NFD는 문자를 정준적으로 분해한 형태로 만든다. 정준적으로 동등하다는 말은 코드 포인트열이 달라도 유니코드가 같은 문자 내용으로 취급한다는 뜻이다.3
접근성과의 관계
유니코드에 문자가 들어 있다는 사실만으로 모든 프로그램에서 같은 방식으로 읽히는 것은 아니다. 프로그램이 인코딩을 잘못 판별하면 다른 글자가 나타날 수 있고, 정규화나 문자 경계 규칙을 적용하지 않으면 검색·정렬·커서 이동·삭제 결과가 달라질 수 있다.
이 차이는 화면 읽기 프로그램과 보조공학기술에도 이어진다. 앱이 올바른 문자와 글자 경계를 전달해야 화면 읽기 프로그램이 한 음절로 읽고, 점역 프로그램이 자모와 약자 규칙을 일관되게 적용할 수 있다. 유니코드는 문자 표현의 공통 기반이지만 실제 접근성은 운영체제와 앱, 보조공학기술의 구현까지 함께 보아야 한다.
함께 볼 개념
참고 자료
- Unicode Consortium, 「The Unicode Standard, Chapter 2: General Structure」
- Unicode Consortium, 「The Unicode Standard, Chapter 18: East Asia」
- Unicode Consortium, 「Unicode Normalization Forms」
- Unicode Consortium, 「Glossary of Unicode Terms」
Footnotes
-
코드 포인트는 유니코드 코드 공간 안에서 문자를 식별하는 정수값이다. UTF-8은 코드 포인트를 1~4개의 8비트 코드 단위로, UTF-16은 하나 또는 두 개의 16비트 코드 단위로, UTF-32는 하나의 32비트 코드 단위로 나타낸다. | Unicode Consortium, 「The Unicode Standard, Chapter 2: General Structure」, Unicode Consortium, 「UTF-8, UTF-16, UTF-32 & BOM」 ↩ ↩2
-
Unicode 16.0 핵심 사양은 현대 한글 음절의 알고리즘식 조합과 분해, U+AC00~U+D7A3의 11,172음절, 한글 자모와 확장 자모 영역을 설명한다. | Unicode Consortium, 「The Unicode Standard, Chapter 18: East Asia」 ↩
-
유니코드 표준 부속서 제15호는 NFD를 정준 분해, NFC를 정준 분해 뒤 정준 결합한 형태로 정의한다. 두 문자열이 정준적으로 동등해도 코드 포인트열과 바이트열은 다를 수 있다. | Unicode Consortium, 「Unicode Normalization Forms」 ↩
