요약

  • RFC 2070은 구체적 HTML 리소스의 외부 바이트 인코딩을 UCS에 고정된 추상 문서 문자 집합과 분리했다. HTTP 또는 MIME의charset값은 디코딩 매핑을 지정했다.
  • 숫자 문자 참조는 고정된 문서 문자 집합 안에서 해석되었기 때문에, 태그를 운반한 외부 인코딩이 달라도 문자의 정체성은 하나로 유지되었다.
  • 디코딩 성공은 한 단계의 전달일 뿐이다. SGML 파싱, 언어 및 양방향 처리, 글꼴 가용성, 형상 출력, 독자의 이해는 서로 다른 책임을 지닌 후속 상태로 남았다.

키릴 대문자 И를 생각해 보자. 한 리소스는 지원되는 인코딩에서 이를 직접 문자로 담을 수 있고, 다른 리소스는И로 쓸 수 있으며, 같은 참조를 다중 바이트 UCS 표현으로 저장할 수도 있다. 회선 위의 옥텟은 다르지만, 수신자가 올바른 디코더를 선택하고 태그가 온전하다면 세 경로 모두 HTML 문서의 같은 문자 번호에 도달한다.

이것이 RFC 2070의 결정적 경계다. 바이트는 구체적 리소스의 속성이고, 번호는 추상 문서의 속성이다. 두 수준이 뒤섞였다면 서버는 전송 인코딩을 바꾸는 것만으로 참조의 의미를 바꿀 수 있었을 것이다. 문서는 목적지를 고정하고, 변화를 디코딩의 관문 안으로 제한했다.

SGML은 구조를 파싱하기 전에 문자 세계가 필요했다

당시 HTML은 SGML 응용 중 하나였다. SGML 문서 문자 집합은 한 파일에서 허용되는 바이트 목록이 아니라, 문서 유형과 그 상태들이 문자를 식별하는 문자 및 숫자의 저장소였다. DTD, 태그, 텍스트 데이터는 하나의 숫자 공간에서 해석되었다.

RFC 1866의 HTML 2.0 기초는 Latin-1 문자를 포함했고, 그 위치를 ISO 10646과 맞추었으며, 미래의 더 넓은 저장소를 가리켰다. RFC 2070은 HTML 2.x 국제화 문서에서 ISO 10646:1993과 그 수정 내용의 Universal Character Set을 선택하여 전환을 완성했다. 발표 당시 RFC는 이를 Unicode 1.1과 위치마다 일치한다고 설명했다.

그러나 저장소가 넓어졌다고 해서 모든 번호가 유효해진 것은 아니다. SGML 선언은 128에서 159까지의 위치를 사용하지 않은 채 남겨 두었기 때문에,’은 이후 소프트웨어가 그에 인쇄상의 모습을 부여하더라도 당시 모델에서는 불법으로 남았다. “Unicode 페이지”라는 표현은 두 가지 주장을 숨길 수 있다. HTML이 이름 붙일 수 있는 추상 문자와, 특정 리소스가 그 문자를 나열하는 외부 인코딩이다. RFC는 첫째를 고정했지만 둘째에 대해 단일한 표현을 강제하지는 않았다.

charset은 진입 경로를 택했을 뿐 목적지를 바꾸지 않았다

외부 인코딩은 전송 또는 저장 맥락에서 왔다. HTTP에서는 응답의Content-Type안에 있는charset값이 인코딩을 결정했고, 전자 우편에서는 MIME 값이 기본 규칙과 함께 같은 역할을 했다. RFC는 당시 FTP나 분산 파일 시스템에는 이에 상응하는 표준 신호가 없었다고 기록했다.

MIME이라는 이름은 오해를 부를 수 있다.charset은 단순한 문자 목록이 아니라 옥텟 문자열을 문자 문자열로 변환하는 방법이었고, 둘 이상의 바이트 시퀀스가 같은 결과에 이르게 할 수도 있었다. RFC 2045는 MIME에 등록된 모든 charset이 이 매핑 전체를 정의하도록 요구했지만, 모든 추상 문자를 역방향으로 인코딩할 수 있어야 한다고 규정하지는 않았다.

참조 모델은 단계를 다음과 같이 배열했다. 리소스 ← 디코더 ← 엔터티 관리자 ← SGML 파서 ← 응용 프로그램 ← 표시. 디코더는 외부 표현을 문서 문자 집합으로 변환하고, 이후 단계는 문자를 다루며, 표시는 이를 다시 장치 표현으로 바꿀 수 있다. 브라우저가 이러한 이름을 그대로 가진 모듈을 포함해야 했던 것은 아니다. 요구된 것은 관찰 가능한 동작이 경계를 유지하는 일이었다. 이 그림은 행동의 계약이지, 1997년 브라우저 구성 요소의 목록이 아니었다.

숫자 참조는 디코딩 뒤에 오기 때문에 안정되었다

RFC 2070은 숫자 문자 참조의 불변성을 이 모델의 가장 중요한 결과로 꼽았다. 숫자 참조는 고정된 문서 문자 집합을 기준으로 해석되므로, 어떤 외부 인코딩에서도 같은 문자를 가리킨다.

순서가 핵심이다. 수신자는 먼저 바이트를 올바르게 변환해&,#, 숫자,;라는 태그 문자로 만들어야 한다. 그 뒤에야 SGML이 참조를 인식하고 그 번호를 해석할 수 있다. 참조는 잘못 디코딩된 스트림을 고치지 못하며, 경계를 올바르게 통과한 뒤에만 안정된다.

고정된 번호가 역방향에서 고정된 바이트를 보장하지는 않는다. RFC는 사용자가 수정하지 않은 양식의 기본값이 전송 시 원본 문서와 다른 유효한 옥텟으로 돌아올 수 있다고 경고했다. 결합 문자열과 미리 조합된 문자는 같은 텍스트를 서로 다른 모습으로 표현할 수 있다. 복사, 저장, 전송은 새로운 인코딩 사건이지 원본 파일의 완전한 재현이 아니다.

인코딩 신호에는 증거력의 순서가 있었다

RFC 2070은 1997년 배포 환경의 제약을 기록했다. 서버는 적절한 charset을 자주 빠뜨렸고, 일부 브라우저는 이를 포함한Content-Type을 잘못 처리했다. 이는 역사적 관찰이며 오늘날 브라우저 점유율에 대한 통계가 아니다.

순서는 문서 출처에서 온 charset에 첫 번째 우선순위를 주고, 이른META HTTP-EQUIV선언에 두 번째, 링크의 안내용CHARSET속성에 마지막 우선순위를 주었다. META는 시작 문제에 부딪혔다. 앞선 바이트가 충분히 디코딩되지 않으면 파서가 이를 찾을 수 없었다. 그래서 RFC는 이 방식을 보장되지 않는 방법으로 묘사하고, 그 유용성을 초기에 ASCII 대응 값을 적절히 드러내는 인코딩으로 제한했다.

이 순서는 권한과 접근 용이성을 분리했다. 가까운 신호가 먼저 보일 수 있지만, 그것이 응답 데이터의 권한을 얻지는 않는다. 반대로 권한 있는 표시도 여전히 하나의 주장이다. 그것은 본문이 매핑과 일치한다는 점을 암호학적으로 증명하지도, 디코더가 이를 성실히 적용했다는 점을 증명하지도 않는다.

문자는 올바르게 도착하고도 화면에서 실패할 수 있다

UCS는 HTML이 정의할 수 있는 범위를 넓혔지만 글꼴을 만들지는 않았다. RFC는 시스템이 분석할 수는 있어도 표시할 수 없는 문자를 예상했고, 단일한 대체 동작을 강제하지 않았다. 누락 글리프 상자나 그 16진수 번호는 표시 정책이지 새로운 정체성이 아니다.

언어와 방향은 두 가지 상태를 더했다.LANG은 모양 선택, 따옴표, 하이픈, 연결, 간격, 발음에 영향을 줄 수 있다.DIR,BDO, Unicode 양방향 알고리즘은 의미를 읽는 데 필요한 시각적 순서를 바꿀 수 있다. 이 도구들은 이미 식별된 문자 위에서 작동하며, 외부 바이트를 다시 정의하지 않는다.

그래서 서로 다른 고장이 존재했다. 잘못된 인코딩 신호, 디코더의 잘못된 출력, 파서의 거부 또는 잘못된 구성, 글꼴 부재와 언어·방향의 잘못된 적용이다. 스크린샷은 어느 단계가 먼저 실패했는지 드러내지 않으며, 올바른 바이트 분할이 그 이후의 성공을 증명하지도 않는다.

HTML에 대한 권한이 옮겨간 뒤에도 경계는 남았다

HTML 명세가 W3C로 옮겨갔을 때, RFC 2854는 RFC 2070과 더 오래된 IETF 문서들을 모두 구식으로 만들었다. 이는 거버넌스와 문서 계보의 사실이지 디코딩 경계가 사라졌다는 증거가 아니다. 이후의text/html등록도charset을 HTML 문서를 바이트 형태로 표현하는 데 쓰이는 인코딩이라고 설명했고, HTML 4.01은 문서 문자 집합만으로는 교환되는 바이트 시퀀스를 해석하기에 충분하지 않다고 확인했다.

Lu Heng의 후대 구분인 최소 초기 명세, 지역화된 미래 결정, 자발적 채택 사이의 구별은 되돌아보기에 유용한 렌즈를 제공한다. 고정된 번호 공간은 작고 공유된 불변이었지만, 디코더 지원, 오류 처리, 글꼴, 표시는 지역적 구현 결정으로 남았다. 규칙을 게시하는 일이 그 결정을 실행하는 것은 아니다.

남는 교훈은 리소스가 도착했다고 해서 바이트가 도착한 것만으로 문서가 되는 것은 아니며, 문자 번호가 해석되었다고 해서 그것이 시각적 형태가 되는 것도 아니라는 점이다. 각 전환에는 고유한 증거가 있고, 어떤 계층도 이전 계층의 전달을 빌려 자신의 권한 범위를 넓히지 않는다.

출처