- 매일 수십억의 사람들이 수백 가지 언어로 문서를 작성함.
- HTTP는 여러 언어와 문자로 된 국제 문서들의 처리 및 전송을 지원해야 함.
국제화 이슈인 문자집합 인코딩과 언어 태그에 대해 알아보자.
- HTTP 어플리케이션은 여러 언어의 문자로 텍스트를 보여주고 요청하기 위해 문자집합 인코딩을 사용함.
- 인코딩된 걸 사용자가 이해할 수 있는 언어만으로 콘텐츠를 서술하기 위해 언어 태그를 사용함.
국제적인 콘텐츠를 다루기 위해 필요한 HTTP 지원
- 국제 콘텐츠 지원 방법
- 서버는 클라이언트에게 각 문서의 문자와 언어를 알려줌.
- 클라이언트가 문서를 이루고 있는 비트들을 올바르게 문자들로 풀어냄.
- 처리해서 사용자들에게 제공함.
- 서버는 클라이언트에게 문서의 문자와 언어를 HTTP
Content-Type charset
매개변수와Content-Language
헤더를 통해 알려줌.
- 클라이언트는 서버에게 자신이 어떤 차셋 인코딩 알고리즘들과 언어들을 이해하며 무엇을 선호하는지 말해주기 위해
Accept-Charset
과Accept-Language
헤더를 보냄.
Accept-Language: fr, en;q=0.8 Accept-Charset: iso-8859-1, utf-8
문자집합과 HTTP
- 차셋(Charset)은 글자를 비트로 변환하는 인코딩임.
- HTTP charset 값은 어떻게 엔터티 콘텐츠 비트들을 특정 문자 체계의 글자들로 바꾸는지 말해줌.
- Content-Type 헤더는 수신자에게 콘텐츠가 HTML 파일임을 말해줌. 그리고 charset 매개변수는 수신자에게 콘텐츠 비트들을 글자들로 디코딩하기 위해 iso-8859-6 아랍 문자집합 디코딩 기법을 사용하라고 말해줌.
- charset 매개변수는 클라이언트에게 어떻게 비트들을 글자들로 변환하는지 알려줌.
ex)
Content-Type: text/html; charset=iso-8859-6
- 문자집합과 인코딩은 어떻게 동작하는가
- 문자집합 = 문자 인코딩 구조 + 코딩된 문자집합
- 문서를 이루는 비트들은, 특정 코딩된 문자집합의 특정 문자로 식별될 수 있는 문자 코드로 변환됨.
- 문자 코드는 코딩된 문자집합의 특정 요소를 선택하기 위해 사용됨.

- 만약 클라이언트가 잘못된 charset 매개변수를 사용한다면, 클라이언트는 이상한 글자를 보여줌.

- 표준화된 MIME 차셋 값
- 특정 문자 인코딩과 특정 코딩된 문자집합의 결합을 MIME 차셋이라고 부름.
- HTTP는 표준화된 MIME 차셋 태그를
Content-Type
과Accept-Charset
헤더에 사용함. - ex)
us-ascii
,iso-8859-1
,utf-8
- Content-Type charset 헤더와 META 태그
- 웹 서버는 클라이언트에게 MIME 차셋 태그를 charset 매개변수와 함께 Content-Type 헤더에 담아 보냄.
- 만약 문자집합이 명시적으로 나열되지 않았다면, 수신자는 문서의 콘텐츠로부터 문자지집합을 추측함.
<HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-2022-jp"> <META LANG="jp"> <TITLE>A Japanese Document</TITLE> </HEAD> <BODY> ...
- Accept-Charset 헤더
- HTTP 클라이언트는 서버에게 정확히 어떤 문자 체계가 가능한지 Accept-Charset 요청 헤더를 통해 알려줌.
다중언어 문자 인코딩에 대한 지침
- 문자집합 용어
문자
: 알파벳 글자, 숫자, 구두점, 표의문자, 기호 등 글쓰기의 최소 단위.글리프
: 하나의 글자를 표현하기 위한, 획의 패턴이나 다른 것과 구분되는 유일한 시각적 형태.코딩된 문자
: 각 글자에 할당된 유일한 숫자.코드 공간
: 문자 코드 값으로 사용하려고 계획해 둔 정수의 범위.코드 너비
: 각 문자 코드의 비트 개수.사용 가능 문자 집합
: 글자들에 대한 특정한 작업 집합.코딩된 문자집합
: 사용 가능 문자집합을 받아서 각 글자에 코드 공간의 코드를 할당해주는 코딩된 문자들의 집합.문자 인코딩 구조
: 숫자로 된 문자 코드들을 콘텐츠 비트의 연속으로 인코딩하는 알고리즘.
- 문자
- 문자는 쓰기의 기본적인 구성요소.
- 문자는 글꼴이나 스타일에 독립적임.
- 한 글자는 여러 가지 다른 쓰기 형태를 가질 수 있음.
- 같은 글자라도 그 글자가 단어에서 어디에 위치하느냐에 따라 각각 다른 모양을 갖는 표기 체계도 많음.


- 글리프, 연자 그리고 표현 형태
- 문자는 유일하고 추상화된 언어의 요소이며, 글리프는 각 글자를 그리는 특정한 방법임.
- 각 문자는 미적인 양식과 스크립트에 따라 여러 글리프를 가짐.
- 쓰기를 보다 멋지게 보이도록 하기 위해, 많은 필기체와 활자체가 인접한 글자들이 부드럽게 이어지는 연자를 지원함.

- 코딩된 문자집합
US-ASCII
: 모든 문자 집합의 어머니 - 아스키는 '정보교환을 위한 미국 표준 코드'로 표준화된 가장 유명한 코딩된 문자집합임.iso-8859
: 국제적인 글쓰기를 위해 글자들을 하이 비트를 이용해서 추가한, US-ASCII의 8비트 확대집합들임.JIS X 0201
: 아스키를 일본어 가타카나 반각문자를 더해 확장한 극단적으로 작은 문자집합임.JIS X 0208
과JIS X 0212
UCS
: 전세계의 모든 글자를 하나의 코딩된 문자집합으로 통합하려고 노력하는 세계적인 표준임.

- 문자 인코딩 구조는 크게 3종류로 분류할 수 있음.
고정폭
: 각 코딩된 문자를 고정된 길이의 비트로 표현함.가변폭(비모달)
: 다른 문자 코드번호에 다른 길이의 비트를 사용함.가변폭(모달)
: 다른 모드로의 전환을 위한 특별한 'escape' 패턴을 사용함.

몇 가지 인코딩 구조를 살펴보자
8비트
: 간단히 각 문자 코드를 그에 대응하는 8비트 값으로 인코딩함.
UTF-8
: 인기있는 UCS를 위해 설계된 문자 인코딩 구조. 문자코드의 값을 위해 비모달 가변길이 인코딩을 사용함.
iso-2022-jp
: 일본어 인터넷 문서를 위해 널리 사용되는 인코딩.
euc-jp
: 일본어 인코딩이며, 'Extended Unix Code'의 약자로, 유닉스 운영체제에서 아시아 문자들을 지원하기 위해 처음 개발됨.
euc-kr
: 한글 인터넷 문서를 위해 널리 사용되는 가변길이 인코딩으로, KS X 1003 과 KS X 1001 의 두 가지 문자 집합을 지원함.
언어 태그와 HTTP
- 언어 태그는 언어에 이름을 붙이기 위한 짧고 표준화된 문자열임.
- Content-Language 헤더
- 엔터티가 어떤 언어 사용자를 대상으로 하고 있는지 서술함.
- Content-Language 헤더는 텍스트 문서만을 위한 것이 아니라 오디오, 동영상, 애플리케이션 등 특정 언어 사용자를 대상으로 할 수 있음.
- 콘텐츠가 여러 언어를 대상으로 한다면, 언어들을 나열할 수 있음.
ex)
Content-Language: mi, en
- Accept-Language 헤더
- 웹 서버가 자원에 대해 여러 언어로 된 버전을 갖고 있다면, 사용자에게 선호하는 언어로 된 컨텐츠를 제공함.
- 클라이언트는 자신이 이해할 수 있는 콘텐츠를 요청하기 위해
Accept-Language
와Accept-Charset
을 사용할 수 있음. ex)Content-Language: es
- 언어 태그의 종류
- 일반적인 언어의 종류
- 특정 국가의 언어
- 방언
- 지방어
- 그외의, 다른 언어의 변형이 아닌 표준 언어
- 비표준 언어
- 언어 태그는
-
으로 분리된 하나 이상의 서브태그로 이루어짐. - 첫번째 서브태그 : 주 서브태그. 표준화되어있음.
- 오직 A부터 Z까지의 글자만을 포함함.
- 두번째 서브태그 : 선택적이고 자신만의 이름 표준을 따름.
- 알파벳, 숫자를 포함할 수 있으며, 최대 8글자까지 가능함.
- 세번째 서브태그 : 등록되어 있지 않음.

- 모든 태그는 대소문자가 구분되지 않으나, 관용적으로 언어를 나타낼 때는 소문자를 사용하고, 국가를 나타낼 때는 대문자를 사용함.
국제화된 URI
- 오늘날 URI는 국제화를 지원하지 않음.
- 오늘날의 URI는 US-ASCII의 부분집합으로 구성되어 있음.
- 국제적 가독성 vs 의미 있는 문자들
- 문자집합에는 제한이 있기 때문에, URI는 비영어권 사람들도 쉽게 사용하고 기억할 수 있도록 설계되지 않음.
- URI 저자들은 리소스 식별자의 가독성과 고유 가능성의 보장이 중요하다고 여김.
- ASCII 문자들의 제한된 집합으로 이루어진 URI를 갖게 됨.
- URI에서 사용될 수 있는 문자들
- URI에서 사용할 수 있는 US-ASCII 문자들의 부분집합은 예약된 문자들, 예약되지 않은 문자들, 이스케이프 문자들로 나뉨.
- 예약되지 않은 문자들은 URI의 구성요소에서 일반적으로 사용될 수 있음.
- 이스케이핑과 역이스케이핑(unescaping)
- URI 이스케이프는 예약된 문자나 다른 지원하지 않는 글자들을 안전하게 URI에 삽입할 수 있도록 방법을 제공함.
- 이스케이프는 퍼센트 글자 하나와 뒤이은 16진수 글자 둘로 이루어진 세 글자 문자열임.
- 내부적으로 HTTP애플리케이션은 URI를 데이터가 필요할 때만 언이스케이핑 해야 함.
- 애플리케이션은 어떤 URI도 결코 두 번 언이스케이핑 되지 않도록 해야 함.
- 이스케이핑된 퍼센트 기호를 포함한 URI를 언이스케이핑하면 퍼센트 기호가 포함된 URI가 만들어짐.
- 잘못하여 한 번 더 언이스케이핑을 하게 되면 이스케이프의 일부처럼 처리되어 데이터의 손실을 유발함.
- 이스케이프 값들은 US-ASCII 코드의 범위에 있어야 함.
기타 고려사항
- 헤더의 명세와 맞지 않는 데이터
- HTTP헤더는 반드시 US-ASCII 문자집합의 글자들로만 이루어져야 함.
- 날짜
- HTTP 명세는 올바른 GMT 날짜를 명확히 정의하지만, 모든 웹 서버와 클라이언트가 규칙을 따르지 않음.
- 명세에 맞지 않는 날짜를 관대하게 받아들이고, 받아들이면서 충돌을 일으키지 말아야 함.
- 도메인 이름
- 국제화 문자를 포함하는 도메인 이름을 국제화 도메인 이름(Internationalizing Domain Name)이라 함.
- 웹 브라우저는 퓨니코드 기법을 이용하여 사용자가 입력한 다국어로 된 도메인 이름을 알파벳과 숫자들로 된 도메인 이름으로 변환함.