kujaHn 2021. 8. 27. 19:44

인터넷은 전 세계 사람들을 묶는 목적으로 탄생했습니다. WWW(World-Wide-Web)이 그 정신을 나타내는 좋은 예시이죠.

전 세계 사람들을 묶기 위한 선행조건이 필요합니다. 바로 언어의 장벽을 허물어야 하는 것인데요. HTTP는 이러한 언어의 문제를 해결하기 위해, 국제 문서들의 처리 및 전송을 여러 언어(문자)로 지원하는데, 이를 '국제화'라고 합니다.

 

기본 메커니즘

컴퓨터의 데이터들은 결국 비트들로 이루어져있기 때문에, 기본 메커니즘은 생각보다 간단합니다.

 

1. 클라이언트가 자신이 알고있는 언어, 문자 정보를 제공한다.

    - 무슨 언어/문자를 지원하는가

    - 무슨 언어를 선호하는가?

 

2. 서버들은 클라이언트들에게 컨텐츠의 정보를 알려준다.

    - 무슨 컨텐츠 인가?

    - 어떻게 비트를 글자로 바꿀 수 있는가?

    - 이 컨텐츠가 어떤 언어에 해당되는가?

 

3. 클라이언트는 제공받은 콘텐츠(비트)들을 각 나라에 맞는 문자들로 풀어내 읽는다.

 

 

문자 집합과 HTTP

가장 중요한 국제 알파벳 스크립트와, 문자 집합 인코딩에 대한 설명입니다.

 

1. Charset은 글자를 비트로 변환하는 인코딩 정보를 알려준다.

HTTP 'Charset' 값은 엔티티 컨텐츠를 이루고 있는 비트들을 어떻게 특정 문자 체계의 글자들로 바꾸는지 알려줍니다.

'Charset' 태그는 비트에서 글자로 또는 그 반대로 변환해주는 알고리즘 정보를 가지고 있습니다.

'Charset' 태그는 등록된 MIME 문자 집합에 표준화되어있고, IANA(Internet Assigned Numbers Authority)가 관리합니다.

 

예시를 하나 봅시다

Content-Type: text/html; charset=euc-kr

발신자는 수신자에게 컨텐츠가 HTML 파일이고, euc-kr로 인코딩 되어 있다고 알려주고 있습니다.

이를 통해 수신자는 euc-kr 알고리즘을 이용해 글자를 문자로 디코딩을 하여, 콘텐츠들을 읽을 것입니다.

 

다르게 말하면 이렇게 잘못된 'Charset' 파라미터를 사용한다면, 클라이언트는 깨지거나 잘못된 글자를 보여줍니다.

문자코드 255(11100001)를 변환한다고 가정합시다.

  • Charset: iso-8859-1이라면 라틴문자 á
  • Charset: iso-8859-7이라면 그리스어 α

이렇게 'Charset' 파라미터는 국제화에서 중요한 정보입니다!

 

2. 문자 집합과 인코딩 동작

컴퓨터에는 정말 많은 언어들이 존재하고, 또 이를 인코딩(글자-> 비트)하는 방법도 많기 때문에, 이를 디코딩하는 방법 역시 표준화된 방법이 필요합니다!

 

비트들을 문자로 변경하는 디코딩 과정을 봅시다. (문자 집합과 코드는 임의로 정했으니 과정만 주목합시다!)

 

1. 문서를 이루는 비트들을 특정 코딩된 문자 집합의 특정 문자로 식별될 수 있는 문자 코드로 변환.

2. 문자 코드와 일치하는 코딩된 문자집합의 특정 문자 선택

3. 선택한 특정 문자를 글꼴과 프레젠테이션 로직을 이용해 출력

그림1 디코딩 과정

이렇게 특정 문자 인코딩과 특정 코딩된 문자집합의 결합을 'MIME Charset'라고 부릅니다.

HTTP는 표준화된 'MIME Charset' 태그를 'Content-Type'과 'Accept-Charset' 헤더에 사용합니다.

 

3. Content-Type Charset 헤더와 META 태그

이전에 들은 예시가 하나 있습니다.

Content-Type: text/html; charset=euc-kr

이렇게 웹 서버는 클라이언트에게 'Content-Type'에 MIME charset 태그를  담아 전송합니다.

만약 이러한 문자 집합이 명시적으로 나열되지 않았다면, 수신자는 문서의 콘텐츠로부터 문자 집합을 추측하려 시도합니다. 예를 들어 HTML 콘텐츠에서 문자 집합은 문자 집합을 서술하는 <META HTTP-EQUIV="Content-Type"> 태그에서 찾을 수 있습니다. 만약 HTML이 아니거나, 'META Content-Type' 태그가 없다면 실제 텍스트를 스캐닝해 패턴을 분석하여 문자 인코딩을 추측합니다.

<HEAD>
	<META HTTP-EQUIV="Content-Type" CONTENT= "text/html; charset=euc-kr">
	<META LANG="kr">
</HEAD>

 

4. Accept-Charset 헤더

대부분의 클라이언트들이 모든 종류의 문자 코딩과 매핑 시스템을 지원하지 않기 때문에 기본 메커니즘에서 클라이언트는 서버에게 자신이 어떤 언어/문자를 지원하는지 설명해야 한다 했습니다. 이러한 정보를 'Accept-Charset' 요청 헤더를 통해 알려줍니다.

Accept-Charset: euc-kr, utf-8
euc-kr 시스템을 UTF-8 가변 길이 유니코드 호환 시스템만큼 잘 받아들일 수 있다!

여기서 어떤 인코딩 구조로 콘텐츠 릴 반환할지는 서버의 자유입니다.

추가적으로 이에 대응하는 'Content-Charset' 응답 헤더는 존재하지 않습니다.

 

 


문자 집합 용어

용어 설명
문자 글쓰기의 최소 단위.
글리프 하나의 글자를 표현하기 위한, 획의 패턴이나 다른 것과 구분되는 유일한 시각적 형태 
하나의 글자를 여러방식(폰트)으로 쓰는 것이 가능하다면, 글리프를 여러개 가질 수 있습니다.
코딩된 문자 글자를 다룰 수 있도록 각 글자에 할당 된 유일한 숫자. (그림1 참고)
코드 공간 문자 코드 값으로 사용하려고 계획해 둔 정수의 범위
코드 너비 각 문자 코드의 비트 개수. 개수를 고정할 수도 가변으로 설정할 수도 있다.
사용 가능 문자집합 글자들에 대한 특정한 작업 집합 (모든 글자의 부분집합입니다.)
코딩된 문자 집합 사용 가능 문자집합을 받아서 각 글자에 코드 공간의 코드를 할당해주는 코딩된 문자들의 집합.
실제 글자들에 숫자로 된 문자코드를 대응시킨 것.
문자 인코딩 구조 문자 코드들을 컨텐츠 비트의 연속으로 인코딩하는 알고리즘
데이터 압축, 제약 회피, 중복 문자집합 통합 등의 역할에 사용
됩니다.

그림2. 문자집합 용어

 

Plus. 코드 너비

이 코드 너비는 고정으로 설정할 수 있고, 또 동적(가변)으로 설정할 수 있습니다. 각각 장단점이 존재합니다.

코드 너비 설정 장점 단점
고정폭 빠른 처리가 가능하다 공간 낭비의 우려가 있다.
(자주 쓰는 글자의 비트 = 안쓰는 글자의 비트)의 경우 효율이 떨어진다.
가변폭(비모달[각주:1]) 자주 사용하는 글자는 비트 길이를 줄여 효율성을 높일 수 있다.
국제 문자에서는 여러 바이트를 사용해 호환성을 유지할 수 있다.
복잡한 표기 체계 지원이 어렵다.
가변폭(모달[각주:2]) 특별한 'escape' 패턴을 통해 다른 모드로 전환을 해 복잡한 표기 체계를 효과적으로 지원해 줄 수 있다. 처리가 복잡하다.

 

언어 태그와 HTTP

1. Content-Laguage 헤더

'Content-Langauge' 엔티티 헤더 필드는 엔티티가 어떤 언어 사용자를 대상으로 하고 있는지를 서술합니다.

한국어 사용자를 대상으로 한다면 필드는 'Content-Language: kr'일 것입니다.

물론 중복도 가능합니다! 'Content-Language: en, kr' 이면 영어와 한국어 모두 가능하다는 뜻입니다.

또한 모든 태그는 대소문자가 구분되지 않기 때문에 'Content-Language: En, KR' 역시 가능합니다.

 

2. Accept-Language 헤더

'Accept-Charset'와 같이 언어 역시 미리 정보를 서버에게 넘겨주어야 그에 맞는 언어로 된 콘텐츠를 받을 수 있습니다.

한국어 언어 컨텐츠를 받고 싶다면 'Accept-Language: kr'를 넘겨줍시다!

 

추가적으로 서버가 'Accept-Lauguage' 헤더에서 제공하는 언어들을 지원하지 않을 때를 대비해 품질값'q'(quality-value)를 사용해 언어의 선호도를 나타내는 방법이 있습니다.

Accept-Language: kr;q=1.0, en;q=0.8, jp;q=0.3

 

 

 

주석

  1. 모드를 따르지 않는 것을 비모달이라고 합니다. [본문으로]
  2. 모드를 따르는 것을 모달이라고 합니다. [본문으로]