http 는 여러 언어와 문자로 된 국제문서의 전송을 지원해야한다.
엔터티 본문은 단순 비트들로 채워져있는데, 이 장에서는 이를 문자언어로 지원해주는 문자집합 인코딩과 언어태그에 관해 알아보자
서버는 아래 헤더를 통해 문서의 문자와 언어를 알려준다
Content-Type: text/html; charset=UTF-8
클라이언트는 아래 헤더를 통해 사용가능한 인코딩 알고리즘과 언어를 명시한다
Accept-Language : fr, en; q=0.8 // q값을 통해 프랑스어를 1순위(1.0) 영어를 2순위(0.8)로 둔다
Accept-Charset : iso-8859-1, utf-8
charset
: 엔터티 콘텐츠의 비트들을 특정 문자로 변환(디코딩) or 문자를 비트로 변환(인코딩) 할 수 있는 알고리즘
MIME charset
: 인코딩과 문자집합의 결합. HTTP는 표준화된 MIME charset 값을 사용한다.
us-ascii, iso-8859-n, utf-8 등등이 있다.
utf-8
: 주로 쓰이는 UCS(유니코드)를 표현하기위한 가변길이 문자 인코딩. 통상적인 7바이트 아스키 문자열에 대한 하위호환성이 있다. 여기서 HTTP는 언어의 라벨 전송에만 관여한다(255와 "ARABIC LETTER FEH"까지). 글자의 모양을 표현하는 일은 HTTP와 무관함.
charset을 잘못 지정하면 엉뚱한 언어가 나옴.(같은 비트더라도 charset에 따라 다른 언어를 나타냄)
Content-Type : 서버가 클라이언트에게 MIME-charset을 명시해준다.
만약 명시되어있지 않다면 수신자는 문서의 콘텐츠로부터 문자 집합을 추측한다.
html콘텐츠 라면 아래 meta 태그에서 찾을수있다.
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
Content-Type 헤더가 없고 html콘텐츠가 아니라면 텍스트를 스캐닝해 패턴을 찾아내고,
패턴을 찾지 못했다면 iso-8859-1인것으로 가정한다.
Accept-Charset : 대부분의 클라이언트는 모든 문자 체계를 지원하지않는다. 따라서 지원가능한 MIME-charset을 명시해줘야한다.
아래는 클라이언트가 서유럽, 가변길이 유니코드 모두 호환됨을 말해준다.
두 인코딩 구조중 어떤것으로 반환할지는 서버 자유이다
Accept-Charset : iso-8859-1, utf-8
표준화된 문자열. (kr, en, fr...)
언어태그는 하이픈으로 분리된 하나 이상의 서브태그들로 이루어져있다.
대소문자 구분은 없으나, 언어는 소문자, 국가는 대문자로 표기함(언어 : fr / 국가 : FR)
오늘날 대부분 URI는 US-ASCII 문자들의 제한적인 집합으로 이루어져있다.
ASCII는 아래 처럼 구성되어있다.
;
/
?
:
@
&
...A-Za-z0-9
-
_
!
~
... 이스케이핑은 예약된 문자 or 지원하지 않는 글자들을 URI에 안전하게 삽입 할 수 있는 방법.
%
+ 16진수 글자 2자
로 이루어져있음.
역 이스케이핑을 2번 하지않도록 주의해야함. 2번 역이스케이핑시 데이터손실 발생 (32 -> %20 -> %25 ? ?)