들어가기

  • HTTP가 어떻게 여러 언어 문자들의 체계 및 표준과 상호작용하는지 설명한다.
  • HTTP 프로그래머가 올바르게 업무를 수행하는데 도움이 될 수 있도록 전문용어, 기술, 표준의 간략한 개요를 제공한다.
  • 언어를 위한 표준 명명 체계와 어떻게 표준화된 언어 태그가 선택한 콘텐츠를 서술하는지에 대해 설명한다.
  • 국제화된 URI의 규칙과 주의사항을 개괄적으로 서술한다.
  • 날짜와 그 외 다른 국제화 이슈에 대해 간단히 논의한다.

16-1. 국제적인 콘텐츠을 다루기 위해 필요한 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
    

16-2. 문자집합과 HTTP

  • Charset은 글자를 비트로 변환하는 인코딩이다
    • HTTP Charset 값은 어떻게 엔터티 콘텐츠 비트들을 특정 문자 체계의 글자들로 바꾸는지 말해준다.
    • Content-Type 헤더는 수신자에게 콘텐츠가 HTML 파일임을 말해준다.
      Content-Type: text/html; charset=iso-8859-6
      
    • charset 매개변수는 수신자에게 콘텐츠 비트들을 글자들로 디코딩하기 위해 iso-8859-6 아랍 문자집합 디코딩 기법을 사용하라고 말해준다.
  • 문자집합과 인코딩은 어떻게 동작하는가
    • A) 데이터 비트 -> 인코딩 구조 -> 문자코드
      • 문서를 이루는 비트들은 특정 코딩된 문자집합의 특정문자로 식별될 수 있는 문자코드로 변환된다.
    • B) 문자코드 -> 코딩된 문자집합 -> 유일한 문자
      • 문자코드는 코딩된 문자집합의 특정 요소를 선택하기 위해 사용된다.
      • A, B에서 사용되는 알고리즘은 MIME 차셋 태그를 통해 결정된다.
    • C) 글꼴과 포매팅 소프트웨어를 사용하여 화면이 보여줄 모양을 찾는다.
  • 잘못된 charset은 잘못된 글자를 낳는다.

  • 표준화된 MIME 차셋값이 존재한다.
    • HTTP는 표준화된 MIME 차셋태그를 Content-Type, Accept-Charset 헤더에 사용한다.
  • Content-Type charset 헤더와 META 태그
    Content-Type= text/html; charset=iso-2022-jp
    
    • 웹 서버는 클라이언트에게 MIME 차셋 태그를 charset 매개변수와 함께 Content-Type 헤더에 담아 보낸다.
    • 만약 없는 경우 HTML 콘텐츠에서 태그에서 찾을 수 있다.
  • Accept-Charset 헤더
    Accept-Charset: iso-8859-1, utf-8
    
    • HTTP 클라이언트는 서버에게 정확히 어떤 문자 체계를 그들이 지원하는지 Accept-Charset을 통해 알려준다.

16-3. 다중언어 문자 인코딩에 대한 지침

  • 문자집합 용어
    • 문자
    • 글리프: 하나의 글자를 표현하기 위한 획의 패턴이나 다른 것과 구분되는 유일한 시각적 형태
    • 코딩된 문자
    • 코드 공간
    • 코드 너비
    • 사용가능 문자집합
    • 코딩된 문자집합
    • 문자 인코딩 구조

16-4 언어 태그와 HTTP

  • 언어 태그는 언어에 이름을 붙이기 위한 짧고 표준화된 문자열이다.

  • Content-Language 헤더
    • 엔터티가 어떤 언어 사용자를 대상으로 하고 있는지 서술한다.
    • 텍스트 문서 이외의 오디오 클립, 동영상, 애플리케이션도 특정 언어 사용자를 대상으로 할 수 있다.
    • 콘텐츠가 여러 언어를 대상으로 한다면, 언어들을 나열할 수 있다.
      Content-Language: mi, en
      
  • Accept-Language 헤더
    • 웹 서버가 자원에 대해 여러 언어로 된 버전을 갖고 있다면, 사용자에게 선호하는 언어로 된 컨텐츠를 제공한다.
    • 클라이언트는 자신이 이해 할 수 있는 콘텐츠를 요청하기 위해 Accept-Language와 Accept-Charset을 사용한다.
  • 대소문자 구분 및 표현
    • 모든 태그는 대소문자가 구분되지 않는다.
    • 관용적으로 언어를 나타날때 소문자, 국가를 나타낼 때는 대문자를 사용한다.

16-5. 국제화된 URI

  • 오늘날 URI는 국제화를 지원하지 않는다.
  • 오늘날의 URI는 US-ASCII의 부분집합으로 구성되어 있다.

  • 국제적 가독성 vs 의미 있는 문자들
    • 문자집합에는 제한이 있기 때문에, URI는 비영어권 사람들도 쉽게 사용하고 기억할 수 있도록 설계되지는 못했다.
    • URI 저자들은 리소스 식별자의 가독성과 고유 가능성의 보장이 중요하다고 여겼다.
    • ASCII 문자들의 제한된 집합으로 이루어진 URI를 갖게 되었다.
  • URI에서 사용될 수 있는 문자들
    • US-ASCII 문자들의 부분집합은 예약된 문자들, 예약되지 않은 문자들, 이스케이프 문자들로 나뉜다.
    • 예약되지 않음: [A-Za-z0-9] ”-“ ”_” ”.” ”!” ”~” ”*” ”‘“ ”(“ ”)”
    • 예약됨: “;” ”/“ ”?” ”:” ”@” ”&” ”=” ”+” ”$” ”,”
    • 이스케이프: “%”
  • 이스케이핑과 역이스케이핑(unescaping)
    • 이스케이프는 예약된 문자난 다른 지원하지 않는 글자들을 안전하게 URI에 삽입할 수 있는 방법을 제공한다.
    • 이스케이프는 퍼센트 글자 하나와 뒤이은 16진수 그자 둘로 이루어진 세 글자 문자열이다.
    • 애플리케이션은 어떤 URI도 두 번 언이스케이핑 되지 않도록 해야 한다.
    • 이스케이핑된 퍼센트 기호를 포함한 URI를 언이스케이핑하면 퍼센트 기호가 포함된 URI가 만들어진다.
    • 잘못하여 한 번 더 언이스케이핑을 하게 되면 이스케이프의 일부처럼 처리되어 데이터의 손실을 유발한다.

16-6. 기타 고려사항

  • 헤더와 명세에 맞이 않는 데이터
    • HTTP 헤더는 반드시 US-ASCII 문자집합의 글자들로만 이루어져야 한다.
    • HTTP 애플리케이션은 글자들을 처리하기 위해 운영체제와 리아브러리 루틴을 사용한다.
  • 날짜
    • HTTP 명세는 올바른 GMT 날짜를 명확히 정의하지만, 모든 웹 서버와 클라이언트가 규칙을 따르지 않는다.
    • 명세에 맞지 않는 날짜를 관대하게 받아들이고, 받아들이면서 충돌을 일으키지 말아야한다.
  • 도메인 이름
    • 국제화 문자를 포함하는 도메인 이름을 국제화 도메인 이름(Internationalizing Domain Name)이라 한다.
    • 웹브라우저는 퓨니코드를 사용해 사용자가 입력한 다국어로 된 도메인 이름을 알파벳과 숫자 등으로 된 도메인 이름으로 변환한다.

** 참고 서적: HTTP 완벽 가이드