Effective-Java-Camp / http-the-definitive-guide

[DONE] HTTP 완벽 가이드 스터디 레포지토리
0 stars 0 forks source link

[4부 16장] 국제화 #15

Open SooKim1110 opened 2 years ago

SooKim1110 commented 2 years ago

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

국제화 관련 헤더

서버 -> 클라이언트: 각 문서의 문자와 언어를 알려준다. Content-Type charset 파라미터, Content-Language(요청 & 응답 헤더 모두에 사용)

클라이언트 -> 서버: 클라이언트가 어떤 Charset 인코딩 알고리즘과 언어를 이해하는지(선호하는지) 알려준다. Accept-Charset, Accept-Language

Content-Type: text/html; charset=UTF-8
Content-Language: en-US

Accept-Langague: fr, en;q=0.8 //q는 품질 인자. 프랑스어는 1.0, 영어는 0.8으로 프랑스어에 우선순위가 있다.
Accept-Charset: iso-8859-1, utf-8

+👀) Content-Language VS. Accept-Lanague

https://stackoverflow.com/questions/6157485/what-are-content-language-and-accept-language

문자집합과 HTTP

Charset

문자집합과 인코딩의 동작

1) 비트 -> 특정 문자로 식별될 수 있는 문자코드로 변환 2) 문자코드 -> 코딩된 문자집합의 특정 요소를 선택

스크린샷 2022-10-02 오전 1 47 10

MIME Charset

웹 서버는 Content-Type 헤더에서 Charset 매개변수를 찾거나, 콘텐츠에서 문자집합을 추측한다(HTML의 태그 등. 추측 못하면 ios-8859-1 가정)

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

문자

글리프

코딩된 문자

코드 공간

코드 너비

사용 가능 문자 집합

코딩된 문자집합

문자 인코딩 구조

2) 가변폭(비모달) 다른 문자 코드 번호에 다른 길이의 비트를 이용

3) 가변폭(모달)

+👀) UTF-8 / EUC-KR

UTF-8 가변폭 문자 인코딩

인코딩 과정

스크린샷 2022-10-02 오전 1 47 45

+) 왜 prefix로 '10'을 사용할까? https://stackoverflow.com/questions/53009692/utf-8-encoding-why-prefix-10

EUC-KR

+👀) 간단한 인코딩 역사 변화

CP 문자셋(2바이트)는 자국에서만 쓸 수 있고, 다른 나라와 호환이 되지 않는다. 그래서 모든 언어를 나타내기 위해 유니코드 만듦. 유니코드 인코딩하기 위해 UTF-16이라는 가변 길이 인코딩을 썼는데, 기본 다국어 평면(https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C_%ED%8F%89%EB%A9%B4#%EA%B8%B0%EB%B3%B8_%EB%8B%A4%EA%B5%AD%EC%96%B4_%ED%8F%89%EB%A9%B4)에 속하는 문자는 2바이트, 다른 건 4바이트로 인코딩. 기존에 1바이트로 문자를 나타낼 수 있던 미국/유럽권에서는 용량이 2배로 늘어난셈. 그래서 UTF-8 등장. 유럽권은 기존 1바이트, 나머지는 2,3,4 바이트로 (한국어는 3바이트)

언어 태그와 HTTP

언어 태그: 언어에 이름을 붙이기 위한 표준화된 문자열 하이픈으로 분리된 하나 이상의 서브태그로 이루어져 있다. 언어는 소문자, 국가는 대문자를 관용적으로 쓰지만 모든 태그는 대소문자 구분이 없다. (한국 ko-KR, 미국 en-US)

Content-Language 헤더 엔티티가 어떤 언어 사용자를 대상으로 하는지

Accept-Language 헤더 클라이언트가 웹 서버에게 언어 제약/선호도를 전달하기 위해 사용

국제화된 URI

조작하고, 공유하기 쉽게 하기 위하여 URI 설계자들은 매우 제한된 공통 문자집합을 선택했다(기본적인 라틴 알파벳 문자, 숫자, 특수문자)

URI에서 사용할 수 있는 US-ASCII 문자들의 부분집합:

예약된 문자들은 URI에서 특별한 의미를 가지며, 일반적으로는 사용될 수 없다.

예약되지 않은 문자: [A-Za-z0-9] - _ . ! ~ * ' ( )
예약된 문자: ; / ? : @ & = + $ ,
이스케이프: % <HEX> <HEX>

+👀)

브라우저 URL에 한글이 들어갈 때

스크린샷 2022-10-02 오전 1 28 47

실제로 URL이 인코딩된 결과 https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=1&ie=utf8&query=%EA%B0%80 가 => %EA%B0%80