ASCII 에서 Unicode 로 — 문자에 번호를 매긴다
문자에 번호를 매기는 제 1 단계의 역사를 따라간다. ASCII 의 128 문자, 일본어 문자 집합의 난립, 그리고 세계의 모든 문자에 고유 번호 U+XXXX 를 매기는 Unicode 까지.
모든 문자 코드의 조상 — ASCII 의 128 문자
「문자에 번호를 매긴다」는 발상의 원점은, 1960 년대 미국에서 태어난 ASCII(American Standard Code for Information Interchange)입니다. ASCII 는 7 비트, 즉 0〜127 의 128 개의 번호에 영대문자·영소문자·숫자·기호, 그리고 줄바꿈 등의 제어 문자를 할당했습니다.
영어권만이라면 이것으로 충분했습니다. 그러나 세계에는 128 개로는 도저히 담을 수 없는 수의 문자가 있습니다. 여기서 「번호를 매기는 방식」을 둘러싼 긴 혼란이 시작됩니다.
소문제 2-1 — ASCII 를 숫자로 읽는다
모든 문자 코드의 토대가 되어 있는 ASCII 를, 실제로 숫자로 읽어 봅니다.
Q1. ASCII 의 설명으로 올바른 것은 어느 것입니까.
ASCII 는 7 비트, 즉 0〜127 의 128 개의 번호에 영숫자·기호·제어 문자(줄바꿈 등)를 할당한 규격입니다. 256 문자가 아닙니다 — 8 번째 비트의 사용처는 각국이 확장으로 서로 차지하게 되었고, 그것이 인코딩 난립의 한 원인이 되었습니다. 일본어는 포함되어 있지 않으며, Unicode 보다 훨씬 오래된 1960 년대의 규격입니다.
Q2. ASCII 에서 「A」의 번호는 16 진으로 0x41 입니다. 이것은 10 진으로 얼마입니까. (16 진의 첫째 자리는 16 의 가중치: 0x41 = 4 × 16 + 1)
0x41 = 4 × 16 + 1 = 65 입니다. 「A = 65」는 많은 프로그래밍 언어에서 얼굴을 내미는 단골 값으로, B = 66, C = 67 로 이어집니다. 소문자 「a」는 0x61 = 97 로, 대문자와 딱 0x20(32)만큼 떨어져 있습니다 — 이 규칙성도 ASCII 설계의 묘미입니다.
Q3. ASCII 에는 일본어가 1 문자도 없습니다. 그 뒤의 전개로 올바른 것은 어느 것입니까.
일본에서는 JIS 규격으로 한자를 포함하는 문자 집합이 정해졌고, 그것을 바이트 열로 만드는 방식으로 Shift_JIS·EUC-JP·JIS 코드(ISO-2022-JP) 등이 병립했습니다. 같은 일본어 문서라도 만든 환경에 따라 바이트 열이 다르다 — 이 난립이야말로 일본어 문자 깨짐 문제의 온상이며, 기종 간 메일 깨짐 등에 시달리는 시대가 길게 이어졌습니다.
일본어의 난립 시대 — 같은 문서가 바이트 열에서는 딴것
일본에서는 JIS 규격으로 한자를 포함하는 문자 집합(어느 한자에 몇 번을 매기는가)이 정해졌습니다. 그런데 그 번호를 바이트 열로 만드는 방식(인코딩)이 여럿 생겨난 것입니다. PC 의 세계에서는 Shift_JIS, UNIX 의 세계에서는 EUC-JP, 전자 메일에서는 JIS 코드(ISO-2022-JP) — 각각의 환경에서 다른 방식이 주류가 되었습니다.
같은 일본어 인사말 「こんにちは」라도, Shift_JIS 파일과 EUC-JP 파일에서는 바이트 열이 완전히 딴것입니다. 제 1 장의 구호를 떠올려 주세요 — 표찰 없는 바이트 열을 받은 쪽은 읽는 방식을 추측할 수밖에 없고, 빗나가면 깨진다. 인코딩이 난립하던 시대의 일본어는, 문자 깨짐의 단골이었던 것입니다. 한국어가 EUC-KR 과 CP949 를 거쳐 온 사정과도 닮은 역사입니다. 이 시대의 주역 Shift_JIS 는 지금도 현역이므로, 제 4 장에서 구조까지 파고듭니다.
Unicode — 세계의 모든 문자에, 고유 번호를
언어마다·환경마다 번호표가 난립할 바에는, 아예 세계의 모든 문자를 1 개의 표에 모아 고유 번호를 매겨 버리자 — 그것이 Unicode 의 발상입니다. 히라가나도, 한자도, 아랍 문자도, 이모지도, 같은 1 개의 번호 공간에 실려 있습니다. 이 번호를 코드 포인트라 부르고, U+XXXX(XXXX 는 16 진수)로 표기합니다.
U+ 뒤의 16 진수는, 익숙해지면 보통의 수로 읽을 수 있습니다. 16 진 1 자리는 0〜15, 자리의 가중치는 1·16·256·4096. 0x3042 = 3 × 4096 + 4 × 16 + 2 = 12354 — 이 바꿔 읽기만, 소문제에서 한 번 손을 움직여 둡시다.
Unicode 가 정하는 것은 제 1 단계(번호)까지. 같은 U+3042 가, 제 2 단계의 인코딩에 따라 다른 바이트 열이 됩니다. 「Unicode = UTF-8」이 아니다, 가 이 그림의 요점입니다.
Unicode 는 「번호」까지 — 바이트로 만드는 일은 남아 있다
여기서 제 1 장의 2 단계 관점이 효력을 발휘합니다. Unicode 가 해결한 것은 제 1 단계(번호를 매기는 방식의 통일)뿐입니다. 번호를 바이트 열로 만드는 제 2 단계에는, 여전히 복수의 방식 — UTF-8·UTF-16·UTF-32 — 이 있습니다. 어느 것이나 같은 Unicode 의 번호를 나르는, 서로 다른 인코딩입니다.
「Unicode 지원입니다」라는 말만으로는, 파일의 바이트 열은 특정되지 않습니다. 실무에서 물어지는 것은 항상 「UTF-8 인가, UTF-16 인가, BOM 은 붙는가」라는 제 2 단계의 선택입니다. 다음 장에서는 그 대표 격인 UTF-8 을, 실제로 비트를 흘려 넣어 손으로 조립합니다.
소문제 2-2 — Unicode 와 코드 포인트
세계의 모든 문자에 고유 번호를 매긴다는 Unicode 의 발상과, U+XXXX 표기의 읽는 법을 확인합니다.
Q4. Unicode 의 기본적인 발상으로 올바른 것은 어느 것입니까.
언어마다 번호표가 난립한 반성에서, Unicode 는 「세계의 모든 문자를 1 개의 표에 모아, 고유 번호를 매긴다」는 길을 택했습니다. 히라가나도 한자도 이모지도, 같은 1 개의 번호 공간에 실려 있습니다. 「2 바이트 고정」은 초기의 예상이었고, 현재의 코드 포인트는 U+10FFFF 까지 있어 2 바이트에는 들어가지 않습니다 — 이 이야기는 제 5 장의 서로게이트 페어로 이어집니다.
Q5. 일본어 문자 「あ」의 코드 포인트는 U+3042 입니다. U+ 뒤는 16 진 표기입니다. 0x3042 는 10 진으로 얼마입니까. (3 × 4096 + 0 × 256 + 4 × 16 + 2)
16 진 4 자리의 가중치는 4096·256·16·1 이므로, 3 × 4096 + 0 + 4 × 16 + 2 = 12288 + 64 + 2 = 12354 입니다. U+XXXX 라는 표기는 「16 진으로 쓴 번호」에 지나지 않으며, 이것을 읽을 수 있으면 Unicode 자료가 훨씬 가까워집니다. 참고로 「あ」의 두 칸 옆 U+3044 는 「い」입니다(사이의 U+3043 은 작게 쓰는 「ぃ」).
Q6. 「U+3042」라는 표기가 가리키는 것은 어느 것입니까.
U+3042 는 제 1 단계의 「번호」입니다. 저장하려면 이 번호를 제 2 단계의 인코딩으로 바이트 열로 바꿀 필요가 있으며, UTF-8 이라면 E3 81 82, UTF-16 이라면 30 42 가 됩니다. 번호는 어느 인코딩을 골라도 변하지 않는다는 점이 급소입니다. 글꼴은 번호에 「모양」을 부여하는 별개의 구조로, 인코딩과는 또 다른 층의 이야기입니다.
이 장에서 가져갈 것
- ASCII 는 7 비트·128 문자. 「A」 = 0x41 = 65. 많은 문자 코드의 토대
- 일본어는 Shift_JIS·EUC-JP 등 인코딩이 난립하는 시대가 길었고, 문자 깨짐의 온상이었다
- Unicode 는 세계의 모든 문자에 고유 번호(코드 포인트, U+XXXX)를 매긴다. 「あ」 = U+3042 = 12354
- Unicode 가 정하는 것은 번호까지. 바이트로 만드는 제 2 단계(UTF-8 등)는 별개의 선택으로 남는다
다음 장은 드디어 제 2 단계의 주역, UTF-8 입니다. U+3042 가 E3 81 82 가 되기까지를, 자신의 손으로 계산합니다.