서버는 클라이언트에게 문서의 문자와 언어를 HTTP Content-Type charset 매개변수
와
Content-Language 헤더
를 통해 알려준다.
동시에, 클라이언트는 서버에게 사용자가 어떤 언어를 이해할 수 있고 어떤 알파벳의 코딩 알고리즘이
브라우저에 설치되어 있는지 말해줄 필요가 있다. Accept-Charset과 Accept-Language 헤더
를 보낸다.
다음 예시는 모국어를 선호하지만 피치 못할 경우에는 영어도 사용하는 프랑스어 사용자가 보낸 것이다.
브라우저는 iso-8859-1 서유럽어 차셋 인코딩과 UTF-8 유니코드 차셋 인코딩을 지원한다.
Accept-Language: fr, en;q=0.8
Accept-Charset: iso-8859-1, utf-8
각 차셋 태그는 비트들을 글자들로 변환하거나 혹은 그 반대의 일을 해주는 알고리즘을 명명한다.
Content-Type: text/html; charset=iso-8859-6
위의 예시는 수신자에게 콘텐츠가 HTML 파일임을 말해주고, charset 매개변수는 수신자에게 콘텐츠 비트들을
글자들로 디코딩하기 위해 iso-8859-6 아랍 문자집합 디코딩 기법을 사용하라고 말해준다.
비트들을 문자로 변환하는 것은 두 단계에 걸쳐 일어난다.
특정 코딩된 문자집합의 특정문자(각각 번호가 매겨져있음)로 식별될 수 있는 문자 코드로 변환
된다.
ex) 데이터 비트: 11100001 -> 문자코드: 225
문자 코드는 코딩된 문자집합의 특정 요소를 선택하기 위해 사용된다.
ex) iso-8859-6에서, 값 225는 'ARABIC LETTER FEH'에 해당
HTTP는 문자 데이터 및 그와 관련된 언어 차셋 라벨의 전송에만 관심을 갖는다.
글자의 모양을 어떻게 표현할 것인가는 사용자의 그래픽 디스플레이 소프트웨어(브라우저, 운영체제, 글꼴)가 결정한다.
만약 클라이언트가 잘못된 charset 매개변수를 사용한다면, 클라이언트는 이상한 깨진 글자를 보여주게 될 것이다.
값 225는 각 charset에 따라 다르게 표현되기 때문이다.
특정 문자 인코딩과 특정 코딩된 문자집합의 결합을 MIME 차셋
이라고 부른다.
HTTP는 표준화된 MIME 차셋 태그를 Content-Type과 Accept-Charset 헤더에 사용한다.
p.432 MIME 차셋 인코딩 태그 표 참조
Content-Type: text/html; charset=iso-2022-jp
웹 서버는 클라이언트에게 MIME 차셋 태그를 charset 매개변수와 함께 Content-Type 헤더에 담아 보낸다.
만약 문자집합이 명시적으로 나열되지 않았다면, 수신자는 문서의 콘텐츠로부터 문자집합을 추측하려 시도한다.
Accpet-Charset 헤더의 값은 클라이언트가 지원하는 문자 인코딩의 목록을 제공한다.
Accept-Charset: iso-8859-1, utf-8
Accept-Charset 요청 헤더에 대응하는 Content-Charset 응답 헤더는 존재하지 않는다.
응답 문자집합은 MIME과의 호환을 위해 Content-Type 응답 헤더의 charset 매개변수를 통해 돌려받는다.
문자
알파벳, 글자, 숫자, 구두점, 표의문자(중국어에서와 같은), 기호 등 글쓰기의 최소 단위.
약식으로 유니코드(Unicode)라 불리는 국제 문자 세트(Universal Character Set, UCS) 계획에 따라
여러 언어의 글자에게 알맞고 유일한 이름을 부여하기 위한 표준화된 이름 집합이 개발되어 왔다.
글리프(glyph)
하나의 글자를 표현하기 위한, 획의 패턴이나 다른 것과 구분되는 유일한 시각적 형태.
코딩된 문자(coded character)
우리가 글자를 다룰 수 있도록 각 글자에 할당된 유일한 숫자
코드 공간(coding space)
문자 코드 값으로 사용하려고 계획해 둔 정수의 범위
코드 너비(code width)
각 문자 코드의 (고정된 크기의) 비트 개수
사용 가능 문자집합(character repertoire)
글자들에 대한 특정한 작업 집합(세상에 존재하는 모든 글자의 부분집합)
코딩된 문자집합(coded character set)
사용 가능 문자집합을 받아서 각 글자에 코드 공간의 코드를 할당해주는 코딩된 문자들의 집합.
실제 글자들에 숫자로 된 문자 코드를 대응
문자 인코딩 구조
숫자로 된 문자 코드들을 콘텐츠 비트의 연속으로 인코딩하는 알고리즘. 문자 인코딩 구조는 글자를 식별하기 위해
필요한 데이터의 양을 줄이거나, 전송상의 어떠한 제약을 회피하거나, 중복된 코딩된 문자집합들을 통합하는데 사용
MIME 차셋 태그는 문자집합을 의미하는 것이 결코 아니다. MIME 차셋 값은 데이터 비트를 고유한
문자의 코드로 매핑하는 알고리즘의 이름이다. 이것은 문자 인코딩 구조와 코딩된 문자집합의 개념을 합친 것이다.
표준 문서를 읽을 때는 정확히 무엇이 정의되어 있는지 알 수 있도록 주의해야 한다.
문자는 글꼴이나 스타일에 독립적이다. 한 글자는 여러 가지 다른 쓰기 형태를 가질 수 있다.
또한 같은 글자라도 그 글자가 단어에서 어디에 위치하느냐에 따라 각각 다른 모양을 갖는 표기 체계도 많다.
각 문자는 미적인 양식과 스크립트에 따라 여러 가지 글리프를 가진다.
쓰기를 보다 멋지게 보이도록 하기 위해, 많은 필기체와 활자체가 인접한 글자들이 부드럽게 이어지는 연자(ligature)를 지원한다.
일반적인 규칙은, 글리프 하나를 다른 것으로 바꾸었을 때 텍스트의 의미가 바뀐다면,
그 두 글리프들은 서로 다른 글자다. 아니라면 그것들은 모양만 다를 뿐 같은 글자이다.
코딩된 문자집합은 보통 코드 번호로 인덱싱된 배열로 구현된다.
그 배열의 원소들은 문자들이다.
US-ASCII: 모든 문자집합의 어머니
아스키는 1968년 ANSI 표준 X3.4 '정보교환을 위한 미국 표준 코드'로 표준화된 가장 유명한 코딩된 문자집합이다.
아스키는 오직 코드 값 0-127만 사용한다.
따라서 코드 공간을 전체로 표현하는데 7비트만이 필요하다. HTTP 메시지(헤더, URI 등등)는 US-ASCII를 사용한다.
iso-8859
US-ASCII의 8비트 확대집합들이다.
추가 비트에 의해 제공되는 추가 공간은 모든 유럽 글자를 담기에는 충분히 크지 않으므로,
iso-8859는 지역에 따라 커스터마이징 된 문자집합을 제공한다.
iso-8559-1 : 서유럽어(예: 영어, 프랑스어)
iso-8559-2 : 중앙 및 동유럽어(예: 체코어, 폴란드어)
iso-8559-3 : 남유럽어
iso-8559-4 : 북유럽어
...
Latin1로도 알려진 iso-8559-1은, HTML을 위한 기본 문자집합이다. 대부분의 유럽어 텍스트를 표현하기 위해
사용될 수 있다.
UCS
국제 문자 세트(Universal Character Set, UCS)는 전 세계의 모든 글자를 하나의 코딩된 문자집합으로
통합하려 노력하는 세계적인 표준이다. UCS는 ISO 10646으로 정의된다.
유니코드는 UCS 표준을 따르는 상업적인 컨소시엄이다.
문자 인코딩 구조들은 숫자로 된 문자 코드를 콘텐츠 비트들로 변환하고 다른 쪽에서는 그들을 다시 문자 코드로 환원한다.
고정폭
고정폭 인코딩은 각 코딩된 문자를 고정된 길이의 비트로 표현한다. 빠르게 처리될 수 있지만 공간을 낭비할 우려가 있다.
가변폭(비모달)
가변폭 인코딩은 다른 문자 코드 번호에 다른 길이의 비트를 사용한다. 자주 사용하는 글자의 비트 길이를
줄일 수 있고, 국제 문자에 대해서는 여러 바이트를 사용하도록 함으로써 이전의 8비트 문자집합과의 호환성도 유지할 수 있다.
가변폭(모달)
모달 인코딩은 다른 모드로의 전환을 위해 특별한 'escape' 패턴을 사용한다.
중첩된 여러 가지 문자집합 간의 전환을 위해 사용될 수 있다. 처리하기 복잡하지만, 복잡한 표기 체계를 효과적으로 지원한다.
다음은 몇 가지 인코딩 구조이다.
8비트
UTF-8
euc-kr
영어(en), 독일어(de), 한국어(ko) 등 언어에 대한 태그가 존재한다.
언어 태그는 브라질 포르투갈어(pt-BR), 미국 영어(en-US) 등과 같이 지역에 따라 변형된 언어나 방언도 표현 가능하다.
엔터티가 어떤 언어 사용자를 대상으로 하는지 서술한다.
주로 프랑스어 사용자를 대상으로 하고 있다면, Content-Language 헤더 필드는 다음을 포함할 것이다.
Content-Language: fr
이 헤더는 텍스트 문서만을 위한 것은 아니다. 오디오 클립, 동영상, 애플리케이션 특정 언어 사용자를 대상으로 할 수 있다.
콘텐츠가 여러 언어 사용자를 대상으로 하고 있다면, 여러 언어를 나열할 수 있다.
웹 서버가 어떤 자원에 대해 여러 언어로 된 버전을 갖고 있다면, 웹 서버는 우리가 선호하는 언어로 된 콘텐츠를 줄 수 있다.
한국어로 된 콘텐츠에 대한 클라이언트 요청은 다음과 같다.
Accept-Language: ko
언어 태그는 하이픈으로 분리된 하나 이상의 서브태그로 이루어진다.
주 서브태그
라 불린다. 이 값들은 표준화되어있음. 주 서브태그는 오직 A부터 Z까지의 글자만을 포함한다. 다음 서브태그는 알파벳이나 숫자를 포함할 수 있으며,
최대 8자까지 가능하다.
모든 태그는 대소문자가 구분되지 않는다. 태그 'en'과 'eN'은 같다.
관용적으로 언어를 나타낼 때는 소문자를 사용하고, 국가를 나타낼 때는 대문자를 사용한다.
첫 번째와 두 번째 언어 서브태그의 값은 여러 가지 표준 문서와 그것들을 관리하는 조직에 의해서 정의된다.
IANA는 RFC 3066의 규칙에 따라 표준 언어 태그의 목록을 관리한다.
첫 번째 서브태그는 보통 ISO 639 표준 언어 집합에서 선택된 표준화된 언어 토큰이다.
첫 번째 서브태그가,
ISO 3166 국가 코드와 지역 표준 집합에서 선택된 표준화된 국가 토큰이다.
두 번째 서브태그는,
세 번째와 그 이후의 서브태그에 대해서는, 8자 이하의 알파벳과 숫자로 이루어져야 한다는 것을 제외하면 규칙이 없다.
URI는 US-ASCII의 부분집합으로 구성되어 있었다. 오늘날 URI에 대한 최신 명세인 RFC 3986은
URI에 UTF-8 문자를 사용할 수 있는 방법을 명시적으로 제시하고 있으므로, 다양한 문자들을 문제 없이 사용할 수 있다.
URI 설계자들은 두 가지 목표가 있었다.
그러나 이 두 목표는 서로 충돌한다. URI 저자들은 가독성과 공유 가능성의 보장이 더 중요하다
판단하였고, 그래서 ASCII 문자들로 이루어진 URI를 갖게되었다.
URI에서 사용할 수 있는 ASCII 문자들의 부분집합은 아래와 같이 나뉜다.
예약되지 않음
URI의 어떤 구성요소에서든 일반적으로 사용가능
예약됨
; / ? : @ & = + $ ,
이스케이프
%
이스케이프는 퍼센트 글자(%)
하나와 뒤이은 16진수 글자
둘로 이루어진 세 글자 문자열
이다.
HTTP 메시지를 처리하기 위해 문자 구분 라이브러리를 사용하기 전에, 메시지에 잘못된 데이터가
포함되어 있을 경우를 대비해 그 라이브러리의 문서를 주의 깊게 읽자.
국제화 도메인 이름(Internationalizing Domain Name)
이라고 한다.