HTTP 메시지는 어떤 언어로 된 콘텐츠든, 이미지, 동영상 혹은 그 외 다른 종류의 미디어처럼 실어 나를 수 있다. HTTP에서 엔터티 본문이란 비트들로 가득 찬 상자에 불과하다.
국제 콘텐츠를 지원하기 위해 서버는 클라이언트에게 각 문서의 문자와 언어를 알려줘서 클라이언트가 올바르게 문서를 이루고 있는 비트들을 문자들로 풀어내고 올바르게 처리해서 사용자에게 콘텐츠를 제공해줄 수 잇도록 할 필요가 있다.
서버는 클라이언트에게 문서의 문자와 언어를 HTTP Content-Type charset 매개변수와
Content-Language 헤더를 통해 알려준다. 이 헤더들은 엔터티 본문의 ‘비트들도 가득 찬 상자’에 무엇이 들어있는지, 어떻게 콘텐츠를 화면에 출력될 올바른 글자들로 바꾸는지 그리고 그 텍스트가 어떤 언어에 해당하는 지 서술한다.
클라이언트는 서버에게 사용자가 어떤 언어를 이해할 수 있고 어떤 알파벳의 코딩 알고리즘이 브라우저에 설치되어 있는지 말해줄 필요가 있다. 클라이언트는 서버에게 자신이 어떤 차셋 인코딩 알고리즘과 언어들을 이해하며 그 중 무엇을 선호하는지 말해주기 위해 Accept-Charset과 Accept-Language 헤더를 보낸다.
참고* 현재는 UTF-8이 잘 지원되고 있고 문자 인코딩을 위해 압도적으로 선호되는 선택이기에 Accept-Charset은 생략한다. Chrome, Firefox, Internet Explorer, Opera, Safari는 이 헤더를 폐기했습니다.
HTTP 차셋 값은 어떻게 엔터티 콘텐츠 비트들을 특정 문자 체계의 글자들로 바꾸는지 말해준다. 각 차셋 태그는 비트들을 글자들로 변환하거나 혹은 그 반대의 일을 해주는 알고리즘을 뜻한다.
💡 Content-Type: text/html; charset=utf-8웹 서버는 클라이언트에게 MIME 차셋 태그를 charset 매개변수와 함께 Content-Type 헤더에 담아 보낸다.
만약 문자집합이 명시적으로 나열되지 않았다면, 수신자는 문서의 콘텐츠로부터 문자집합을 추측하려 시도한다. HTML 콘텐츠에서 문자 집합은 문자 집합을 서술하는
태그에서 찾을 수 있다. 💡만약 문서가 HTML이 아니라면, 혹은 META Content-Type태그가 없다면 소프트웨어는 언어와 인코딩에 대한 일반적인 패턴을 찾기 위해 실제 텍스트를 스캐닝하여 문자 인코딩을 추측한다.
대부분의 클라이언트는 모든 종류의 문자 코딩과 매핑 시스템을 지원하지 않는다.
HTTP 클라이언트는 서버에서 정확히 어떤 문자 체계를 그들이 지원하는지 Accept-Charset 요청 헤더를 통해 알려준다. Accept-Charset 헤더 값은 클라이언트가 지원하는 문자 인코딩의 목록을 제공한다.
Content-Language 헤더는 엔터티가 어떤 언어 사용자를 대상으로 하고 있는지 서술한다.
Content-Language 헤더는 텍스트 문서만을 위한 것이 아니다. 오디오 클립, 동영상, 그리고 애플리케이션도 특정 언어 사용자를 대상으로 할 수 있다. 특정 언어 사용자를 대상으로 하는 어떤 종류의 미디어라도 Content-Language 헤더를 가질 수 있다.
만약 콘텐츠가 여러 언어 사용자를 대상으로 하고 있다면, 여러 언어를 나열할 수 있다. 그러나 여러 언어가 하나의 엔터티에 동시에 사용되었다고 해서 반드시 여러 언어 사용자들을 대상으로 하고 있음을 의미하는 것은 아니다.
HTTP는 우리에게 우리의 언어 제약과 선호도를 웹 서버에 전달할 수 있게 해준다. 만약 웹 서버가 어떤 자원에 대해 여러 언어로 된 버전을 갖고 있다면, 웹 서버는 우리가 선호하는 언어로 된 콘텐츠를 줄 수 있다.
서버는 사용자의 언어로 된 동적인 콘텐츠를 생성하거나, 이미지를 선택하거나, 대상 언어에 맞는 상품 광고를 보여주기 위해 Accept-Language 헤더의 값을 읽을 수 있다.
클라이언트는 자신이 이해할 수 있는 콘텐츠를 요청하기 위해 Accept-Language와 Accept-Charset을 사용할 수 있다.
언어 태그는 대소문자가 구분되지 않는다. 그러나 관용적으로 언어를 나타낼 때는 소문자를 사용하고, 국가를 나타낼 때는 대문자를 사용한다.
URI에서 사용할 수 있는 US-ASCII 문자들의 부분집합은 예약된 문자들, 예약되지 않은 문자들, 이스케이프 문자들로 나뉜다. 예약되지 않은 문자들은 그것들을 허용하는 URI의 어떤 구성요소에서든 일반적으로 사용될 수 있다. 예약된 문자들은 많은 URI에서 특별한 의미를 가지기에 일반적으로 사용될 수 없다.
URI 이스케이프는 예약된 문자나 다른 지원하지 않는 글자들(스페이스와 같이)을 안전하게 URI에 삽일할 수 있는 방법을 제공한다. 이스케이프는 퍼센트 글자(%)하나와 뒤이은 16진수 글자 둘로 이루어진 세 글자 문자열이다. 16진수 두 글자는 US-ASCII 문자의 코드를 나타낸다.
만약 URI에 스페이스(아스키 코드 32)를 삽입하고 싶으면, 이스케이프 ‘%20’을 사용할 수 있다.
여기서 ‘20’은 32의 16진법 표현이다.
URI를 해석할 땐 이스케이핑된 코드 바이트들은 원래의 ASCII 코드 바이트로 변환된다.
이스케이프 값들은 US-ASCII 코드의 범위(0 ~ 127)에 있어야 한다.
HTTP 애플리케이션은 URI를 데이터가 필요할 때만 언이스케이핑 해야 한다. 애플리케이션은 어떤 URI도 결코 두 번 언이스케이핑 되지 않도록 해야 한다. 왜냐하면 이스케이핑된 퍼센트 기호를 포함한 URI를 언이스케이핑하면 퍼센트 기호가 포함된 URI가 만들어지게 되는데, 여기서 잘못하여 한 번 더 언이스케이핑을 하게 되면 퍼센트 기호 뒤에 있는 문자들이 이스케이프의 일부인 것처럼 처리되어 데이터의 손실을 유발할 수 있기 때문이다.
국제화 문자를 포함하는 도메인 이름을 ‘국제화 도메인 이름’이라고 하는데 오늘날 대부분의 웹브라우저가 퓨니코드를 이용해 이를 지원한다. 퓨니코드란 유니코드 문자열을 호스트 명에서 사용 가능한 문자만으로 이루어진 문자열로 변환하는 방법이다. 웹브라우저들은 이 기법을 이용해 사용자가 입력한 다국어로 된 도메인 이름을 알파벳과 숫자 등으로 된 도메인 이름으로 변환한다.