HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
👻
개발 기록
/
🐿️
HTTP 완벽 가이드
/
📘
16. 국제화
📘

16. 국제화

  • 매일 수십억의 사람들이 수백 가지 언어로 문서를 작성함.
  • HTTP는 여러 언어와 문자로 된 국제 문서들의 처리 및 전송을 지원해야 함.
 
💡
국제화 이슈인 문자집합 인코딩과 언어 태그에 대해 알아보자.
  • HTTP 어플리케이션은 여러 언어의 문자로 텍스트를 보여주고 요청하기 위해 문자집합 인코딩을 사용함.
  • 인코딩된 걸 사용자가 이해할 수 있는 언어만으로 콘텐츠를 서술하기 위해 언어 태그를 사용함.
 

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

  • 국제 콘텐츠 지원 방법
    • 서버는 클라이언트에게 각 문서의 문자와 언어를 알려줌.
    • 클라이언트가 문서를 이루고 있는 비트들을 올바르게 문자들로 풀어냄.
    • 처리해서 사용자들에게 제공함.
  • 서버는 클라이언트에게 문서의 문자와 언어를 HTTP Content-Type charset 매개변수와 Content-Language 헤더를 통해 알려줌.
  • 클라이언트는 서버에게 자신이 어떤 차셋 인코딩 알고리즘들과 언어들을 이해하며 무엇을 선호하는지 말해주기 위해 Accept-Charset과 Accept-Language 헤더를 보냄.
 

문자집합과 HTTP

  • 차셋(Charset)은 글자를 비트로 변환하는 인코딩임.
    • HTTP charset 값은 어떻게 엔터티 콘텐츠 비트들을 특정 문자 체계의 글자들로 바꾸는지 말해줌.
    • Content-Type 헤더는 수신자에게 콘텐츠가 HTML 파일임을 말해줌. 그리고 charset 매개변수는 수신자에게 콘텐츠 비트들을 글자들로 디코딩하기 위해 iso-8859-6 아랍 문자집합 디코딩 기법을 사용하라고 말해줌.
      • ex)Content-Type: text/html; charset=iso-8859-6
    • charset 매개변수는 클라이언트에게 어떻게 비트들을 글자들로 변환하는지 알려줌.
  • 문자집합과 인코딩은 어떻게 동작하는가
    • a. 인코딩 구조를 사용하여 디코딩
b. 코딩된 문자집합을 사용하여 글자를 찾음.
c. 글꼴과 포매팅 소프트웨어를 사용하여 화면이 보여줄 모양을 찾음.
      a. 인코딩 구조를 사용하여 디코딩 b. 코딩된 문자집합을 사용하여 글자를 찾음. c. 글꼴과 포매팅 소프트웨어를 사용하여 화면이 보여줄 모양을 찾음.
    • 문자집합 = 문자 인코딩 구조 + 코딩된 문자집합
    • 문서를 이루는 비트들은, 특정 코딩된 문자집합의 특정 문자로 식별될 수 있는 문자 코드로 변환됨.
    • 문자 코드는 코딩된 문자집합의 특정 요소를 선택하기 위해 사용됨.
  • 만약 클라이언트가 잘못된 charset 매개변수를 사용한다면, 클라이언트는 이상한 글자를 보여줌.
    • 브라우저가 값 225(11100001)를 가져온 경우.
      브라우저가 값 225(11100001)를 가져온 경우.
  • 표준화된 MIME 차셋 값
    • 특정 문자 인코딩과 특정 코딩된 문자집합의 결합을 MIME 차셋이라고 부름.
    • HTTP는 표준화된 MIME 차셋 태그를 Content-Type과 Accept-Charset 헤더에 사용함.
    • ex) us-ascii, iso-8859-1, utf-8
  • Content-Type charset 헤더와 META 태그
    • 웹 서버는 클라이언트에게 MIME 차셋 태그를 charset 매개변수와 함께 Content-Type 헤더에 담아 보냄.
    • 만약 문자집합이 명시적으로 나열되지 않았다면, 수신자는 문서의 콘텐츠로부터 문자지집합을 추측함.
  • Accept-Charset 헤더
    • HTTP 클라이언트는 서버에게 정확히 어떤 문자 체계가 가능한지 Accept-Charset 요청 헤더를 통해 알려줌.
 

다중언어 문자 인코딩에 대한 지침

  • 문자집합 용어
    • 문자 : 알파벳 글자, 숫자, 구두점, 표의문자, 기호 등 글쓰기의 최소 단위.
    • 글리프 : 하나의 글자를 표현하기 위한, 획의 패턴이나 다른 것과 구분되는 유일한 시각적 형태.
    • 코딩된 문자 : 각 글자에 할당된 유일한 숫자.
    • 코드 공간 : 문자 코드 값으로 사용하려고 계획해 둔 정수의 범위.
    • 코드 너비 : 각 문자 코드의 비트 개수.
    • 사용 가능 문자 집합 : 글자들에 대한 특정한 작업 집합.
    • 코딩된 문자집합 : 사용 가능 문자집합을 받아서 각 글자에 코드 공간의 코드를 할당해주는 코딩된 문자들의 집합.
    • 문자 인코딩 구조 : 숫자로 된 문자 코드들을 콘텐츠 비트의 연속으로 인코딩하는 알고리즘.
  • 문자
    • 문자는 쓰기의 기본적인 구성요소.
    • 문자는 글꼴이나 스타일에 독립적임.
    • 한 글자는 여러 가지 다른 쓰기 형태를 가질 수 있음.
      • notion image
    • 같은 글자라도 그 글자가 단어에서 어디에 위치하느냐에 따라 각각 다른 모양을 갖는 표기 체계도 많음.
      • notion image
  • 글리프, 연자 그리고 표현 형태
    • 문자는 유일하고 추상화된 언어의 요소이며, 글리프는 각 글자를 그리는 특정한 방법임.
    • 각 문자는 미적인 양식과 스크립트에 따라 여러 글리프를 가짐.
    • 쓰기를 보다 멋지게 보이도록 하기 위해, 많은 필기체와 활자체가 인접한 글자들이 부드럽게 이어지는 연자를 지원함.
      • notion image
  • 코딩된 문자집합
    • 코딩된 문자집합은 보통 코드 번호로 인덱싱된 배열로 구현됨.
      코딩된 문자집합은 보통 코드 번호로 인덱싱된 배열로 구현됨.
    • US-ASCII : 모든 문자 집합의 어머니 - 아스키는 '정보교환을 위한 미국 표준 코드'로 표준화된 가장 유명한 코딩된 문자집합임.
    • iso-8859 : 국제적인 글쓰기를 위해 글자들을 하이 비트를 이용해서 추가한, US-ASCII의 8비트 확대집합들임.
    • JIS X 0201 : 아스키를 일본어 가타카나 반각문자를 더해 확장한 극단적으로 작은 문자집합임.
    • JIS X 0208 과 JIS X 0212
    • UCS : 전세계의 모든 글자를 하나의 코딩된 문자집합으로 통합하려고 노력하는 세계적인 표준임.
  • 문자 인코딩 구조는 크게 3종류로 분류할 수 있음.
    • 고정폭 : 각 코딩된 문자를 고정된 길이의 비트로 표현함.
    • 가변폭(비모달) : 다른 문자 코드번호에 다른 길이의 비트를 사용함.
    • 가변폭(모달) : 다른 모드로의 전환을 위한 특별한 'escape' 패턴을 사용함.
문자 인코딩 구조는 character code를 비트들로 인코딩하고 다시 원래대로 돌려놓음.
문자 인코딩 구조는 character code를 비트들로 인코딩하고 다시 원래대로 돌려놓음.
💡
몇 가지 인코딩 구조를 살펴보자
  • 8비트 : 간단히 각 문자 코드를 그에 대응하는 8비트 값으로 인코딩함.
  • UTF-8 : 인기있는 UCS를 위해 설계된 문자 인코딩 구조. 문자코드의 값을 위해 비모달 가변길이 인코딩을 사용함.
  • iso-2022-jp : 일본어 인터넷 문서를 위해 널리 사용되는 인코딩.
  • euc-jp : 일본어 인코딩이며, 'Extended Unix Code'의 약자로, 유닉스 운영체제에서 아시아 문자들을 지원하기 위해 처음 개발됨.
  • euc-kr : 한글 인터넷 문서를 위해 널리 사용되는 가변길이 인코딩으로, KS X 1003 과 KS X 1001 의 두 가지 문자 집합을 지원함.
 

언어 태그와 HTTP

  • 언어 태그는 언어에 이름을 붙이기 위한 짧고 표준화된 문자열임.
  • Content-Language 헤더
    • 엔터티가 어떤 언어 사용자를 대상으로 하고 있는지 서술함.
    • Content-Language 헤더는 텍스트 문서만을 위한 것이 아니라 오디오, 동영상, 애플리케이션 등 특정 언어 사용자를 대상으로 할 수 있음.
    • 콘텐츠가 여러 언어를 대상으로 한다면, 언어들을 나열할 수 있음.
      • ex) Content-Language: mi, en
  • Accept-Language 헤더
    • 웹 서버가 자원에 대해 여러 언어로 된 버전을 갖고 있다면, 사용자에게 선호하는 언어로 된 컨텐츠를 제공함.
    • 클라이언트는 자신이 이해할 수 있는 콘텐츠를 요청하기 위해 Accept-Language와 Accept-Charset을 사용할 수 있음. ex) Content-Language: es
  • 언어 태그의 종류
    • 일반적인 언어의 종류
    • 특정 국가의 언어
    • 방언
    • 지방어
    • 그외의, 다른 언어의 변형이 아닌 표준 언어
    • 비표준 언어
  • 언어 태그는 -으로 분리된 하나 이상의 서브태그로 이루어짐.
    • notion image
    • 첫번째 서브태그 : 주 서브태그. 표준화되어있음.
      • 오직 A부터 Z까지의 글자만을 포함함.
    • 두번째 서브태그 : 선택적이고 자신만의 이름 표준을 따름.
      • 알파벳, 숫자를 포함할 수 있으며, 최대 8글자까지 가능함.
    • 세번째 서브태그 : 등록되어 있지 않음.
  • 모든 태그는 대소문자가 구분되지 않으나, 관용적으로 언어를 나타낼 때는 소문자를 사용하고, 국가를 나타낼 때는 대문자를 사용함.
 

국제화된 URI

  • 오늘날 URI는 국제화를 지원하지 않음.
  • 오늘날의 URI는 US-ASCII의 부분집합으로 구성되어 있음.
  • 국제적 가독성 vs 의미 있는 문자들
    • 문자집합에는 제한이 있기 때문에, URI는 비영어권 사람들도 쉽게 사용하고 기억할 수 있도록 설계되지 않음.
    • URI 저자들은 리소스 식별자의 가독성과 고유 가능성의 보장이 중요하다고 여김.
    • ASCII 문자들의 제한된 집합으로 이루어진 URI를 갖게 됨.
  • URI에서 사용될 수 있는 문자들
    • URI에서 사용할 수 있는 US-ASCII 문자들의 부분집합은 예약된 문자들, 예약되지 않은 문자들, 이스케이프 문자들로 나뉨.
    • 예약되지 않은 문자들은 URI의 구성요소에서 일반적으로 사용될 수 있음.
  • 이스케이핑과 역이스케이핑(unescaping)
    • URI 이스케이프는 예약된 문자나 다른 지원하지 않는 글자들을 안전하게 URI에 삽입할 수 있도록 방법을 제공함.
    • 이스케이프는 퍼센트 글자 하나와 뒤이은 16진수 글자 둘로 이루어진 세 글자 문자열임.
    • 내부적으로 HTTP애플리케이션은 URI를 데이터가 필요할 때만 언이스케이핑 해야 함.
    • 애플리케이션은 어떤 URI도 결코 두 번 언이스케이핑 되지 않도록 해야 함.
    • 이스케이핑된 퍼센트 기호를 포함한 URI를 언이스케이핑하면 퍼센트 기호가 포함된 URI가 만들어짐.
    • 잘못하여 한 번 더 언이스케이핑을 하게 되면 이스케이프의 일부처럼 처리되어 데이터의 손실을 유발함.
    • 이스케이프 값들은 US-ASCII 코드의 범위에 있어야 함.
 

기타 고려사항

  • 헤더의 명세와 맞지 않는 데이터
    • HTTP헤더는 반드시 US-ASCII 문자집합의 글자들로만 이루어져야 함.
  • 날짜
    • HTTP 명세는 올바른 GMT 날짜를 명확히 정의하지만, 모든 웹 서버와 클라이언트가 규칙을 따르지 않음.
    • 명세에 맞지 않는 날짜를 관대하게 받아들이고, 받아들이면서 충돌을 일으키지 말아야 함.
  • 도메인 이름
    • 국제화 문자를 포함하는 도메인 이름을 국제화 도메인 이름(Internationalizing Domain Name)이라 함.
    • 웹 브라우저는 퓨니코드 기법을 이용하여 사용자가 입력한 다국어로 된 도메인 이름을 알파벳과 숫자들로 된 도메인 이름으로 변환함.
 
Accept-Language: fr, en;q=0.8 Accept-Charset: iso-8859-1, utf-8
<HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-2022-jp"> <META LANG="jp"> <TITLE>A Japanese Document</TITLE> </HEAD> <BODY> ...