합동회사 코무라소프트
2장

ASCII 에서 Unicode 로 — 문자에 번호를 매긴다

문자에 번호를 매기는 제 1 단계의 역사를 따라간다. ASCII 의 128 문자, 일본어 문자 집합의 난립, 그리고 세계의 모든 문자에 고유 번호 U+XXXX 를 매기는 Unicode 까지.

모든 문자 코드의 조상 — ASCII 의 128 문자

「문자에 번호를 매긴다」는 발상의 원점은, 1960 년대 미국에서 태어난 ASCII(American Standard Code for Information Interchange)입니다. ASCII 는 7 비트, 즉 0〜127 의 128 개의 번호에 영대문자·영소문자·숫자·기호, 그리고 줄바꿈 등의 제어 문자를 할당했습니다.

「A」 = 0x41(65)
대문자는 0x41 부터 순서대로 늘어선다. B = 0x42, C = 0x43 …
「a」 = 0x61(97)
소문자는 대문자의 딱 0x20(32) 뒤. 비트 1 개의 차이로 대소 변환이 가능한 설계
「0」 = 0x30(48)
숫자 문자 「0」과 수치 0 은 별개. 이 구별도 문자 코드 이해의 첫걸음

영어권만이라면 이것으로 충분했습니다. 그러나 세계에는 128 개로는 도저히 담을 수 없는 수의 문자가 있습니다. 여기서 「번호를 매기는 방식」을 둘러싼 긴 혼란이 시작됩니다.

소문제 2-1 — ASCII 를 숫자로 읽는다

모든 문자 코드의 토대가 되어 있는 ASCII 를, 실제로 숫자로 읽어 봅니다.

Q1. ASCII 의 설명으로 올바른 것은 어느 것입니까.

Q2. ASCII 에서 「A」의 번호는 16 진으로 0x41 입니다. 이것은 10 진으로 얼마입니까. (16 진의 첫째 자리는 16 의 가중치: 0x41 = 4 × 16 + 1)

Q3. ASCII 에는 일본어가 1 문자도 없습니다. 그 뒤의 전개로 올바른 것은 어느 것입니까.

일본어의 난립 시대 — 같은 문서가 바이트 열에서는 딴것

일본에서는 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 진수)로 표기합니다.

「A」 = U+0041
ASCII 의 번호가 그대로 Unicode 의 선두에 끼워 넣어져 있다(호환성을 위한 포석)
「あ」 = U+3042
16 진 3042 = 10 진 12354. 히라가나는 U+3041 부터 늘어선다
「😀」 = U+1F600
이모지도 번호를 가진다. 4 자리를 넘는 큰 번호는 제 5 장에서 효력을 발휘한다

U+ 뒤의 16 진수는, 익숙해지면 보통의 수로 읽을 수 있습니다. 16 진 1 자리는 0〜15, 자리의 가중치는 1·16·256·4096. 0x3042 = 3 × 4096 + 4 × 16 + 2 = 12354 — 이 바꿔 읽기만, 소문제에서 한 번 손을 움직여 둡시다.

일본어 문자 「あ」가 Unicode 에서 코드 포인트 U+3042 가 되고, UTF-8 에서는 E3 81 82, UTF-16 에서는 30 42 의 바이트 열이 되는 2 단계의 그림

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 의 기본적인 발상으로 올바른 것은 어느 것입니까.

Q5. 일본어 문자 「あ」의 코드 포인트는 U+3042 입니다. U+ 뒤는 16 진 표기입니다. 0x3042 는 10 진으로 얼마입니까. (3 × 4096 + 0 × 256 + 4 × 16 + 2)

Q6. 「U+3042」라는 표기가 가리키는 것은 어느 것입니까.

이 장에서 가져갈 것

  • 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 가 되기까지를, 자신의 손으로 계산합니다.