[HTTP완벽가이드] 16. 국제화
16. 국제화
각 나라의 언어에 해당하는 컨텐츠를 올바르게 전송하기 위해 표준화된 인코딩 알고리즘을 사용한다.
이 정보는 Content-Type 헤더의 charset 파라미터와 Accept-Charset 헤더, Content-Language 헤더 안에 담겨있다.
HTTP 메시지의 국제화 관련 헤더
- 전송받은 컨텐츠가 어떤 방식으로 변환되어야 하는 지: Content-Type의 charset, Accept-Charset
- 컨텐츠가 어떤 언어에 해당하는 지: Content-Language, Accept-Language
- Accept-Charset, Accept-Language: 처리할 수 있는 값 여러 개를 보낼 수 있고, 품질인자 q를 사용해 선호도를 표시할 수 있다.
문자집합과 HTTP
charset
- MIME charset 태그는 문자의 인코딩 정보와 숫자로 표현된 문자가 어떤 문자에 해당하는 지에 대한 코딩된 문자집합 정보를 의미한다.
- MIME charset 값은 표준화되어 있으며, US-ASCII, ISO-8859-1(Latin1), UTF-8 EUC-KR 등이 있다.
- Content-Type을 통해 charset이 전달되지 않은 경우,
브라우저는 HTML 파일 내의
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
등과 같이 charset을 추측할 수 있게 한다. - 만약, 문서가 HTML 파일이 아니거나, META Content-Type 태그가 없다면 브라우저는 텍스트를 읽어 언어를 추론한다.
Accept-Charset 헤더
클라이언트가 처리할 수 있는 charset 목록 전달받은 인코딩 목록 중 어떤 인코딩을 사용할 지는 서버의 자유
문자인코딩과 관련된 용어
용어집
- 문자(character): 한 글자(기호, 문장 기호, 숫자 등을 포함하는 글쓰기의 최소단위)
- 글리프(glyph): 글자가 화면에 어떻게 보여질 지(폰트적용된 결과)
- 코딩된 문자(coded character): ASCII 코드 번호처럼 각 글자에 할당된 유일한 숫자
- 코드 공간(coding space): 문자 코드 값을 저장할 수 있는 정수의 최대 범위
- 코드 너비(code width): 각 문자코드의 비트 갯수
- 사용가능한 문자집합(character response)
- 코딩된 문자집합(coded character set): 글자들에 대한 특정한 작업 집합
모호하게 사용되는 charset 용어
- charset은 본래 언어를 표현하기 위한 문자집합을 의미하지만,
- 때에 따라 문자의 인코딩 방법과 코딩된 문자집합을 의미한다. (예: HTTP 헤더 속의 charset)
코딩된 문자집합
- US-ASCII, UCS 등의 코딩된 문자집합이 존재한다.
- US-ASCII:
- 모든 문자 집합의 어머니, 7비트를 사용하여 0~127까지의 문자만 표현할 수 있다.
- HTTP 메시지(헤더, URI)는 US-ASCII를 사용해야 한다.
문자 인코딩 구조
- 고정폭/가변폭 변환방식이 있고, 가변폭 방식 내에서도 이스케이프 처리 유무에 따라 모달(유)/비모달(무) 방식으로 나뉜다.
- 고정폭 인코딩의 예로 8비트 방식이 있고, 가변폭 인코딩의 예로 UTF-8(비모달) 방식이 있다
- euc-kr은 한글 인코딩 방식이다.
언어 태그와 HTTP
HTTP 메시지 내의 언어정보를 담는 곳
- Content-Language, Accept-Language 헤더를 통해 표현
- 전달하는 컨텐츠의 언어를 모두 표현하기보다는 대상 독자의 언어를 표현하는 것이 낫다.
- 예: 영어코드가 포함된 한글 블로그 글은 en, ko 보다는 ko로 표현하는 것이 맞다
언어태그의 표현
- {첫번째 서브태그}-{두번째 서브태그)-{세번째 서브태그} 형식으로 표현
- 언어태그는 대소문자를 구분하지 않는다. 관용적으로 언어는 소문자, 국가는 대분자로 씀
- 첫번째 서브태그는 언어 정보를, 두번째 서브태그는 국가나 지역을 의미하며, 세번째 서브태그는 8자이하의 알파벳과 숫자로 이루어져야 한다는 것을 제외하면 다른 규칙은 없다
국제화된 URI
- URI는 ASCII 문자로 제한하고 있다
- 리소스 식별자의 가독성과 공유 가능성의 보장이 대부분의 의미있는 문자로 구성하는 것보다 더 중요하 여김
- ASCII 문자 중 예약된 문자는 URI로 사용할 수 없다. 이 경우, 이스케이프(%)처리를 해서 3자리의 이스케이프 문자열로 전달한다.
- 언이스케이핑이 두번 이상될 경우, % 문자열이 의도오 다르게 언이스케이핑되므로 그러지 않도록 주의한다.
- 영어 이외의 다른 언어의 문자들은 ASCII로 표현할 수 없으므로 엄밀히 말하면 이스케이핑되면 안된다.
기타
- HTTP 헤더는 반드시 US-ASCII 안의 문자들로만 이루어져야 한다.
- 날짜는 GMT 날짜 형식을 따라야 하며, 각 언어에서 해당 날짜를 표현하는 문자를 보내는 것은 명세에 맞지 않다.
- 영어가 아닌 언어로 도메인 입력 시(예 한글 도메인), 브라우저는 punycode를 이용해 ASCII 문자로 구성된 도메인으로 변경한다.