kakasoo

[HTTP] 22. 국제화 본문

프로그래밍/HTTP

[HTTP] 22. 국제화

카카수(kakasoo) 2021. 1. 31. 17:05
반응형

HTTP는 여러 언어와 문자로 된 국제 문서들의 처리 및 전송을 지원해야 한다.

16.1 국제적인 콘텐츠를 다루기 위한 HTTP 지원

  • 엔터티 본문은 그저 비트일 뿐이다.
  • 이 비트들을 어떻게 해석할 것인지를 서버와 클라이언트가 의사소통해야 한다.
    • 서버는 클라이언트에게 HTTP Content-Type charset 매개변수와 Content-Language 헤더를 통해서 알려준다.
    • 클라이언트는 서버에게 Accept-Charset과 Accept-Language 헤더를 보내서 자신이 해석 가능한 언어를 말한다.
      • Charset은 iso 인코딩을 말하는 것이고, Language는 인간의 언어를 의미하는데, 콜론으로 구분하여 q=0.8과 같이 선호도를 표현할 수 있다.

16.2 문자집합과 HTTP

16.2.1 차셋(Charset)은 글자를 비트로 변환하는 인코딩이다 ( 또는 반대로 )

Content-Type: text/html; charset=iso-8859-6

위는 수신자에게 콘텐츠가 HTML 파일임을 말해주고, charset 매개변수는 수신자에게 콘텐츠 비트들을 글자로 디코딩하기 위해 iso-8859-6 (아랍 문자집합 디코딩 기법) 을 사용하라 말해준다.

중국어, 일본어, 아랍어 등 언어마다 글자 수가 서로 달라서 비트 개수가 다르기 때문에 문자 집합이 무엇인지 알아야 디코딩할 수가 있다.

16.2.2 문자 집합과 인코딩은 어떻게 동작하는가

비트를 문자로 변환하는 것은, 디코딩 기법에 맞게 비트를 해석하여 매칭되는 글자를 찾고, 다음에는 글꼴과 포매팅 소프트웨어를 찾아 화면으로 출력할 모양을 찾는 순서로 진행된다.

어떤 글꼴과 모양으로 표현할 것인가는 사용자의 그래픽 디스플레이 소프트웨어 ( 브라우저, 운영체제, 글꼴 ) 가 직접 결정한다.

16.2.3 잘못된 차셋은 잘못된 글자를 낳는다

글자를 잘못된 charset 매개변수를 사용한다면 당연히 잘못된 글자가 나온다. 아랍어를 서유럽 문자로 인코딩할 수도 있다.

16.2.4 표준화된 MIME 차셋 값

특정 문자 인코딩과 특정 코딩된 문자 집합의 결합을 MIME 차셋이라고 부른다. HTTP는 표준화된 MIME 차셋 태그를 Content-Type과 Accept-Charset 헤더에 사용한다.

16.2.5 Content-Type charset 헤더와 META 태그

Content-Type: text/html; charset=iso-2022-jp

위처럼 charset이 명시되지 않은 경우, 수신자는 문서의 콘텐츠로부터 문자 집합을 추측하려 시도한다.

<HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-2022-jp"> </HEAD>

만약 콘텐츠로부터도 추측할 수 없다면 iso-8859-1 ( 서유럽 문자를 지원하기 위한 ASCII의 8비트 확장 )인 것으로 간주한다.

16.2.6 Accept-Charset 헤더

  • 위에서 반복적으로 설명했듯이, 클라이언트는 Accept-Charset 요청 헤더를 통해 자신들이 어떤 문자 체계를 지원하는지를 알린다.
  • 위 사항을 보고 어떠한 문자 체계로 반환할지는 서버의 자유다.

16.3 다중언어 문자 인코딩

문자 언어 집합 체계에 대해서 이해해보자.

16.3.1 문자집합 용어

문자

알파벳 글자, 숫자, 구두점, 표의문자, 기호 등 글쓰기의 최소 단위. 약식으로 유니코드라고 불리는 국제문자 세트 계획에 따라 유일한 이름을 부여하기 위한 표준화 이름 집합이 개발되어 왔다.

글리프

하나의 글자를 표현하기 위한, 획의 형태나 다른 것과 구분되는 유일한 시각적 형태. 하나의 글자를 여러 방식으로 쓸 수 있다면, 글리프가 여러 개인 셈이다. ( 결국 글꼴이라는 것 아닌가? )

코딩된 문자

우리가 글자를 다룰 수 있도록, 글자에 할당해놓은 유일한 숫자를 의미한다.

코드 공간

문자 코드 값으로 사용하려고 계획해 둔 정수의 범위 ( 문자 코드의 범위 )

코드 너비

각 문자 코드에 고정된 비트 개수

사용 가능 문자 집합

글자들에 대한 특정한 작업 집합 ( 세상에 존재하는 모든 글자의 부분 집합 )

코딩된 문자집합

사용 가능한 문자 집합의 숫자로 된 문자, 즉 코딩된 문자들.

문자 인코딩 구조

숫자로 된 문자 코드들을 콘텐츠 비트의 연속으로 인코딩하는 ( 그리고 원래대로 디코딩하는 ) 알고리즘. 단순히 해석만이 아니라 압축, 전 제약 회피 등을 위해서도 쓰인다.

16.3.2 '차셋(Charset)'은 형편없는 이름이다

MIME의 차셋 태그 (앞서 말한 Content-Type charsert과 Accept-Charset 헤더 )는 문자 집**합을 의미하는 것이 아니다.**

문자 집합을 의미할 때도 charset을 쓰지만, MIME 차셋 태그도 똑같이 charset이란 표현을 사용하고 있기 때문에 적절한 해석이 중요하다.

16.3.3 문자

문자는 쓰기의 기본 요소이다. 문자는 글꼴이나 스타일에 독립적이다. 또한 단어에서 어디 위치에 있느냐에 따라서 똑같은 글자라도 쓰는 법이 달라지기도 한다.

16.3.4 글리프(glyphs), 연자(ligatures) 그리고 표현형태

글리프와 문자를 헷갈려서는 안 된다. 문자는 유일하고 추상화된 언어의 요소이며, 글리프는 그 글자들을 표현하는 특정한 방법들을 의미한다.

연자는 특정한 조건에 맞는 두 글자들이 연달아 나오는 경우, 두 글씨의 획을 이어서 쓰는 방법을 말한다.

16.3.5 코딩된 문자 집합 (Coded Character Set)

코딩된 문자집합은 보통 코드 번호로 인덱싱된 배열로 구현된다. 그 배열의 원소들은 모두 문자들이다.

16.3.6 문자 인코딩된 구조

고정폭

고정폭 인코딩은 각 코딩된 문자를 고정된 길이의 비트로 표현하는 것이다. 빠르게 처리되지만 공간은 낭비된다.

가변폭(비모달)

가변폭 인코딩은 다른 문자 코드 번호에 다른 길이의 비트를 사용한다. 자주 사용하는 글자의 비트 길이를 줄일 수 있고, 국제 문자에 대해서는 여러 바이트를 쓰게 하여 호환성도 유지한다.

가변폭(모달)

모달 인코딩은 다른 모드로의 전환을 위해 'escape' 패턴을 사용한다. 예를 들어 어떤 모달 인코딩은 중첩된 여러 가지 문자 집합 간의 전환을 위해 사용될 수 있다.

8비트

8비트 고정 폭 아이덴티티 인코딩은 각 문자 코드를 그에 대응하는 8비트 값으로 인코딩한다.

UTF-8

비모달 가변길이 인코딩을 사용한다. 첫 바이트의 선두 비트들은 인코딩된 문자열의 길이를 바이트 단위로 표현하고, 그 이후의 바이트들은 각각 6비트의 코드 값을 담는다.

euc-kr

다른 모든 표기는 제외하고, 한국어만을 설명한다.

euc-kr은 한글 인터넷 문서를 위해 널리 사용되는 가변 길이 인코딩으로, KS X 1003과 KS X 1001 두 가지 문자 집합을 지원한다.

KS X 1001에 있는 한글 문자의 수는 2,350자로, 현대 한글 글자 수인 11,172개에 턱없이 모자르다.

따라서 한글 채움 문자라는 방식을 이용하는데, 이는 글자를 (채움) 초성, 중성, 종성으로 표현하는 방식을 의미한다.

16.4 언어 태그와 HTTP

언어 태그는 언어에 붙인 이름이다. 예컨대 프랑스어를 누군가는 France, French, Fr, F 등 각기 다른 방식으로 표현하고 있을 것이다. 이런 혼동을 줄이기 위해 각 언어에 태그를 부여하였다.

16.4.1 Content-Language 헤더

Content-Langauge 헤더는 문서가 어떤 사용자를 대상으로 하고 있는지를 서술한다

이는 문서가 어떤 언어로 이루어져 있는지를 의미하는 것이 아니라, 사용자를 보고 판단해야 함을 의미한다. 예컨대 한국 영어 교과서는 영어권을 위한 것이 아니라 한국어 사용자를 위한 것이다.

16.4.2 Accept-Language 헤더

이 헤더를 통해 클라이언트가 사용가능한 언어 목록을 전달할 수 있다. 서버는 이것을 보고 클라이언트가 선호하는 언어 목록을 우선적으로 찾아볼 것이다.

16.4.3 언어 태그의 종류

  • 일반적인 언어의 종류 ( 영어 en)
  • 특정 국가의 언어 ( 영국식 언어en-GB )
  • 방언
  • 지방어
  • 그 외 다른 언어의 변형이 아닌 표준 언어
  • 비표준 언어

16.4.4 서브태그

16.4.5 대소문자의 구분 및 표현

태그는 대소문자를 구분하지 않는다. 관용적으로 언어를 나타낼 때는 소문자, 국가를 나타낼 때는 대문자를 쓴다.

16.4.6 IANA 언어 태그 등록

16.4.7 첫번째 서브 태그: 이름 공간

첫번째 서브 태그는 보통 ISO 639 표준 언어 집합에서 선택된 표준화된 언어 토큰이다.

  • 글자가 'i' 라면 이 언어 태그는 IANA에 등록된 것이다.
  • 글자가 'x' 라면 이 언어 태그는 특정 개인이나 집단 전용의 비표준 확장 서브태그이다.
  • 여기는 언어들을 참조한다.

16.4.8 두번째 서브 태그: 이름 공간

  • 두글자라면 국가나 지역을 의미하고, 3 ~ 8 글자라면 IANA에 등록된 것이다.
  • 한글자는 뭔가 잘못된 것이다.
  • 첫번째 서브 태그와 두번째를 합쳐서 미국식 영어와 같이 표현할 수 있게 된다.

16.4.9 나머지 서브 태그: 이름공간

8자 이하의 알파벳과 숫자로 이루어져야 한다는 것을 제외하고는 별 다른 규칙이 없다.

16.4.10 선호 언어 설정하기

16.4.11 언어태그 참조표

16.5 국제화된 URI

16.5.1 국제적 가독성 vs 의미있는 문자들

URI 저자들은 리소스 식별자의 가독성과 공유 가능성의 보장이 대부분의 의미있는 문자들로 구성될 수 있도록 하는 것보다 중요하다고 판단했다. ⇒ 제한된 문자로만 URI를 작성할 수 있게 했다.

16.5.2 URI에서 사용될 수 있는 문자들

URI에서 사용될 수 있는 문자들은 US-ASCII 문자들의 부분집합으로, 예약된 문자들, 예약되지 않은 문자들, 이스케이프 문자들로 나뉜다.

16.5.3 이스케이핑과 역이스케이핑 (unescaping)

URI 이스케이프는 예약된 문자나, 다른 지원하지 않은 글자들을 안전하게 삽입할 수 있는 방법을 제공한다. 이스케이프는 퍼센트 글자와 16진수 글자 둘로 이루어진 세글자 문자열이다.

내부적으로 HTTP 애플리케이션은 URI를 데이터가 필요한 때만 언이스케이핑해야 한다.

더 중요한 것은 어떤 URI도 두 번 언이스케이핑되지 않도록 해야 한다는 점이다.

이스케이핑된 퍼센트 기호를 포함한 URI를 언이스케이핑하면 퍼센트 기호가 포함된 URI가 만들어지게 될 것인데, 여기서 잘못하면 한 번 더 언이스케이핑 될 수도 있다.

이는 데이터의 손실을 유발한다.

16.5.4 국제 문자들을 이스케이핑하기

이제는 상관 없는 내용이다. ( 예전에는 사용가능한 숫자 범위가 정해져 있었지만, 최근에는 이런 내용을 무시하는 경우가 많다. )

16.5.5 URI에서의 모달 전환

16.6 기타 고려사항

16.6.1 헤더와 명세에 맞지 않는 데이터

몇몇 어플리케이션은 ASCII가 아닌 글자가 주어졌을 때 부적절한 결과를 반환하거나 충돌을 일으킨다.

HTTP 메시지를 처리하기 위해 문자 구분 라이브러리를 사용하기 전에, 메시지에 잘못된 데이터가 포함되어 있을 가능성을 대비해 그 라이브러리의 문서를 충분히 주의깊게 읽어야 한다.

16.6.2 날짜

HTTP 명세는 올바른 GMT 날짜 형식을 정의하고 있지만, 모든 서버와 클라이언트가 규칙을 따르지는 않는다.

HTTP 애플리케이션은 명세에 맞지 않는 날짜도 관대하게 받아들이고, 받아들이면서 충돌을 내지는 말아야 하지만, 처리할 수 없는 날짜에 대해서는 보수적으로 다루어야 한다.

16.6.3 도메인 이름

유니코드 문자열을 호스트 명에서 사용가능하게끔 문자열을 변환하는데, 이를 퓨니코드 라고 한다. 한글 도메인도 이 방식을 이용한다.

반응형

'프로그래밍 > HTTP' 카테고리의 다른 글

[HTTP] 24. 웹 호스팅  (0) 2021.01.31
[HTTP] 23. 내용 협상과 트랜스 코딩  (0) 2021.01.31
[HTTP] 21. 엔터티와 인코딩  (0) 2021.01.31
[HTTP] 20. 보안 HTTP  (0) 2021.01.31
[HTTP] 19. 기본 인증  (0) 2021.01.31