HTML의 문자 인코딩
Character encodings in HTMLHTML |
---|
비교 |
HTML(Hypertext Markup Language)이 1991년부터 사용되어 온 가운데, 1997년 12월부터 HTML 4.0은 국제문자가 합리적으로 완전한 대우를 받은 최초의 표준화된 버전이었다.HTML 문서에 7비트 ASCII 범위를 벗어나는 특수 문자가 포함된 경우, 정보의 무결성과 범용 브라우저 디스플레이라는 두 가지 목표를 고려할 가치가 있다.
문서의 문자 인코딩 지정
문서에 사용되는 문자 인코딩을 지정하는 두 가지 일반적인 방법이 있다.
첫째, 웹 서버는 문자 인코딩 또는 "을 포함할 수 있다.charset
"HTTP(Hypertext Transfer Protocol)에서Content-Type
일반적으로 다음과 같은 머리글:[1]
내용 유형: text/html; charset=ISO-8859-4
이 방법은 HTTP 서버에 콘텐츠 협상에 따라 문서의 인코딩을 변경할 수 있는 편리한 방법을 제공한다. 특정 HTTP 서버 소프트웨어는 이를 수행할 수 있다(예: 모듈과의 Apache). mod_charset_lite
.[2]
둘째, 선언문은 문서 자체에 포함될 수 있다.
HTML의 경우 이 정보를 안에 포함할 수 있다.head
문서 상단에 가까운 요소:[3]
<변형시키다 http-equiv="콘텐츠 유형" 내용물="텍스트/텍스트; charset=utf-8">
또한 HTML5는 다음과 같은 구문이 정확히 같은 의미를 갖도록 한다.[3]
<변형시키다 차르셋="utf-8">
XHTML 문서에는 다음과 같은 세 번째 옵션이 있다: XML 선언을 통해 문자 인코딩을 표현:[4]
<?xml 버전="1.0" 인코딩="ISO-8859-1"?>
이 두 번째 접근방식은 선언문을 구문 분석하기 전에는 문자 인코딩을 알 수 없기 때문에 선언서 자체를 포함하여 문서에서 어떤 문자 인코딩이 사용되는지 알 수 있는 문제가 있다.문자 인코딩이 ASCII 확장자인 경우 선언 자체를 포함한 콘텐츠는 순수 ASCII여야 하며 이는 올바르게 작동한다.UTF-16BE 및 UTF-16LE와 같은 ASCII 확장자가 아닌 문자 인코딩(즉, ASCII의 상위 집합이 아님)의 경우 웹 브라우저와 같은 HTML 프로세서는 휴리스틱스 사용을 통해 경우에 따라 선언문을 구문 분석할 수 있어야 한다.
인코딩 탐지 알고리즘
HTML5의 경우 권장 문자 집합은 UTF-8이다.[3] 규격에 "인코딩 스니핑 알고리즘"을 정의하여 다음과 같은 여러 입력 소스를 기반으로 문서의 문자 인코딩을 결정한다.
- 명시적 사용자 지침
- 문서의 처음 1024바이트 내에 있는 명시적 메타 태그
- 문서의 처음 3바이트 내의 바이트 순서 표시
- HTTP Content-Type 또는 기타 전송 계층 정보
- 특정 시퀀스 또는 바이트 값의 범위 [5]및 기타 임시 탐지 메커니즘을 찾는 문서 바이트의 분석.
인쇄 가능한 ASCII 범위(32~126)를 벗어나는 문자는 대개 잘못 나타난다.이것은 영어를 사용하는 사용자들에게 몇 가지 문제를 제시하지만, 다른 언어들은 정기적으로(어떤 경우에는 항상) 그 범위를 벗어나는 문자를 요구한다.여러 개의 다른 멀티바이트 인코딩이 사용되고 있는 중국어, 일본어, 한국어(CJK) 언어 환경에서는 자동 감지 기능도 채용되는 경우가 많다.마지막으로, 브라우저는 사용자가 잘못된 문자 집합 레이블을 수동으로 재정의하는 것을 허용한다.
모든 언어에 대해 동일한 인코딩을 사용할 수 있는 다국어 웹사이트와 비서양 언어의 웹사이트가 UTF-8을 사용하는 것이 점점 더 일반화되고 있다.모든 언어에도 사용할 수 있는 UTF-16이나 UTF-32는 바이트 지향 ASCII 슈퍼셋 인코딩을 가정하는 프로그래밍 언어에서는 다루기 더 어려울 수 있고, 일반적으로 HTML 문서의 경우인 ASCII 문자의 빈도가 높은 텍스트에서는 효율성이 떨어지기 때문에 널리 사용되지 않는다.
페이지의 성공적인 보기가 반드시 인코딩이 올바르게 지정되었음을 나타내는 것은 아니다.페이지 작성자와 독서자가 모두 플랫폼별 문자 인코딩을 가정하고 있고 서버가 식별 정보를 보내지 않는 경우, 독서자는 그럼에도 불구하고 페이지를 작성자가 의도한 대로 볼 수 있지만, 다른 플랫폼이나 다른 모국어를 사용하는 다른 독서자는 페이지를 의도한 대로 볼 수 없을 것이다.
허용된 인코딩
최근의 HTML 표준(현재의 WHTWG HTML 리빙 표준, 이전의 경쟁 W3C HTML 5.0 및 5.1)에서 참조하는 WHTWG 인코딩 표준은 브라우저가 지원해야 하는 인코딩 목록을 지정한다.HTML 표준은 다른 인코딩의 지원을 금지한다.[6][7][8]인코딩 표준은 또한 UTF-8을 독점적으로 사용하기 위해 새로운 형식, 새로운 프로토콜(기존 형식을 사용하는 경우에도) 및 새로운 문서의 작성자가 필요하다고 규정하고 있다.[9]
UTF-8 이외에도, 인코딩 표준을 참조하여 HTML 표준 자체에 다음과 같은 인코딩이 명시적으로 나열되어 있다.[8]
- ^ 다음에 대해서도 지정됨
TIS-620
,ISO-8859-11
및 관련 라벨.[9] - ^ 다음에 대해서도 지정됨
ASCII
,ISO-8859-1
및 관련 라벨.[9] - ^ 다음에 대해서도 지정됨
ISO-8859-9
및 관련 라벨.[9] - ^ 0xA3으로 지정됨A0은 호환성을 이유로, U+E5E5(개인용 문자)를 제외한, IDO 공간(U+3000)[10][11]의 중복 인코딩으로,또한 유로 부호의 대체 인코딩(U+20AC; Windows-936 참조)으로 승인된 0x80으로 지정된다.[12]그렇지 않으면 2005년 표준의 매핑을 따른다.[11]
- ^ HKSCS 확장자(리드 바이트가 0xA1 미만인 확장자)의 대부분은 인코더에 포함되지 않지만, 디코더에만 포함되어 있다.[13]
- ^ 사양에는 IBM 및 NEC 확장이 포함된다(Windows-31J 참조).[14]
- ^ 명세서는 시프트 JIS에 사용된 것과 동일한 지수를 사용한다(접근 거리 내에 있는 한), 즉 NEC 연장을 포함한다.반폭 카나는 인코더에 의해 전체폭으로 변환되지만 디코더에 의해 탈출순서(ESC 0x28 0x49)를 사용하여 허용된다.[15][16]Shift Out 및 Shift In(0x0E 및 0x0F)은 공격을 방지하기 위해 완전히 제외된다.[16][17]
- ^ 사실 통일 한글 코드는 한글 음절 전체를 포괄하는 상위 집합이다.[18]
- ^ 디코딩 전용으로 지정되며, UTF-16 코드 문서의 양식 제출은 UTF-8로 인코딩되어야 한다.[19]
- ^ 배포된 콘텐츠와의 호환성을 위해 일반용으로도 지정됨
UTF-16
라벨([20]Byte Order Mark, 존재하는 경우)은 라벨보다 우선한다.[21]디코딩 전용으로 지정되며, UTF-16 코드 문서의 양식 제출은 UTF-8로 인코딩되어야 한다.[19] - ^ 0x00 ~ 0x7F ~ U+007F를 통해 U+000000에, U+F7FF(Private Use Area)를 통해 0x80 ~ 0xFF를 U+F780에 매핑하여 코드 포인트의 낮은 8비트가 항상 원래 바이트와 일치하도록 한다.[22]
인코딩 표준에는 다음과 같은 추가 인코딩이 나열되어 있으므로 이에 대한 지원도 필요하다.[9]
- ^ ISO-8859-8과 동일한 인코더 및 디코더를 사용하지만 ISO-8859-8로 표시된 문서에 사용되는 시각 순서 동작의 영향을 받지 않는다.[23]
- ^ 제목이 KOI8-U이고 두 가지 모두에 대해 지정됨
KOI8-U
그리고KOI8-RU
라벨,[9] 그러나 KOI8-RU(즉, includes/ў 포함)를 따른다.[24][25] - ^ 다음에 대해서도 지정됨
GB2312
및 관련 라벨.디코딩을 위해 GB18030과 동일하게 취급한다.[26]인코딩을 위해 GBK(또는 GB2312)로 라벨을 표시하면 4바이트 코드는 제외되며 U+20AC의 경우 1바이트 0x80 표현을 선호한다.[10] - ^ 규격은 Shift JIS에 사용된 것과 동일한 지수를 사용한다(EUC 코드 세트 1의 범위 내에서), 즉 NEC 확장을 포함한다.JIS X 0212는 디코딩 전용이다.[27]
금지된 인코딩의 명시적 예로는 다음과 같은 인코딩이 열거되어 있다.[8]
이 표준은 또한 "대체" 디코더를 정의하는데, 이 디코더는 특정 인코딩으로 표시된 모든 콘텐츠를 대체 문자( �)에 매핑하여 처리를 전혀 거부한다.이는 악의적인 내용을 숨기기 위해 지원되는 인코딩에서 클라이언트와 서버 간의 차이를 악용할 수 있는 공격(예: 사이트 간 스크립팅)을 방지하기 위한 것이다.[28]동일한 보안 우려사항이 ISO-2022-JP와 UTF-16에도 적용되어 ASCII 바이트의 시퀀스를 다르게 해석할 수 있지만, 배포된 콘텐츠에서 비교적 자주 사용되기 때문에 이 접근법은 실현 가능하지 않은 것으로 보였다.[29]다음과 같은 인코딩이 이 치료를 받는다.[30]
문자 참조
고유 문자 인코딩 외에도 문자를 문자 참조로 인코딩할 수 있으며, 문자 참조는 숫자 문자 참조(십진수 또는 십진수) 또는 문자 도면요소 참조가 될 수 있다.문자 도면요소 참조는 HTML을 위해 명명된 도면요소 또는 HTML 도면요소라고도 한다. HTML의 문자 참조 사용은 SGML에서 유래한다.
HTML 문자 참조
HTML의 숫자 문자 참조는 범용 문자 집합/유니코드 코드 포인트에 의한 문자를 말하며, 형식을 사용한다.
&#nnnn;
또는
&#xhhhh;
여기서 nnn은 십진법 형태의 코드 포인트, hhhh는 16진법 형태의 코드 포인트다.x는 XML 문서에서 소문자여야 한다.nnn 또는 hhh는 임의의 자릿수일 수 있으며 선행 0을 포함할 수 있다.hhhh는 대문자와 소문자를 혼합할 수 있지만, 대문자는 일반적인 스타일이다.
HTML 문서의 수신자가 사용하는 모든 웹 브라우저나 이메일 클라이언트, HTML 문서의 작성자가 사용하는 텍스트 편집기가 모든 HTML 문자를 렌더링할 수 있는 것은 아니다.대부분의 현대 소프트웨어는 사용자 언어에 대한 문자 대부분을 표시하거나 모든 문자를 표시할 수 있으며, 사용자가 렌더링할 수 없는 문자에 대해 상자나 기타 명확한 표시를 그릴 것이다.
원래 7비트 ASCII 표준 세트인 0~127까지의 코드의 경우 문자 참조 없이 대부분의 문자를 사용할 수 있다.160부터 255까지의 코드는 모두 문자 엔티티 이름을 사용하여 만들 수 있다.엔티티 이름을 사용하여 번호가 높은 코드 몇 개만 만들 수 있지만, 모두 소수점 문자 참조로 만들 수 있다.
문자 도면요소 참조도 형식을 가질 수 있다.&name;
여기서 name은 대소문자를 구분하는 영숫자 문자열이다.예를 들어, "λ"는 로 인코딩될 수도 있다.λ
HTML 문서로.도면요소가 참조하는 문자 도면요소<
,>
,"
그리고&
다음과 같은 이유로 HTML과 SGML로 미리 정의된다.<
,>
,"
그리고&
마크업을 구분하는 데 이미 사용됨.이는 특히 XML을 포함하지 않았다.'
(') HTML5 이전 엔티티. HTML 문자 엔티티 참조가 도입된 버전과 함께 모든 명명된 HTML 문자 엔티티 참조 목록은 XML 및 HTML 문자 엔티티 참조 목록을 참조하십시오.
HTML 문자 참조의 불필요한 사용은 HTML 가독성을 현저히 감소시킬 수 있다.웹 페이지에 대한 문자 인코딩을 적절하게 선택한 경우, HTML 문자 참조는 일반적으로 위에서 언급한 문자로 구분하는 마크업과 몇 개의 특수 문자(또는 UTF-8과 같은 네이티브 유니코드 인코딩을 사용하는 경우에는 전혀 필요하지 않음)에만 필요하다.잘못된 HTML 엔티티 탈출은 사이트 간 스크립팅과 같은 주입 공격에 대한 보안 취약성을 열 수도 있다.HTML 속성이 인용되지 않은 상태로 남겨진 경우, 공백이나 탭과 같은 가장 중요한 공백인 특정 문자는 엔티티를 사용하여 이스케이프해야 한다.HTML과 관련된 다른 언어들은 그들만의 문자 탈출 방법을 가지고 있다.
XML 문자 참조
문자 도면요소 참조의 범위가 넓은 기존의 HTML과 달리, XML에는 사전 정의된 문자 도면요소 참조가 5개만 있다.특정 컨텍스트에서 표시에 민감한 문자를 이스케이프하는 데 사용된다.[31]
&
→&(암퍼샌드, U+0026)<
→ < (표지보다 작음, U+003C)>
→ > (표지보다 큼, U+003E)"
→ "(쿼트 마크, U+0022)'
→ '아포스트로피, U+0027)'
다른 모든 문자 도면요소 참조는 사용하기 전에 정의되어야 한다.예를 들어, 의 사용é
(e, 라틴어 소문자 E, 급성 사투리, 유니코드의 U+00E9) XML 문서에 엔티티가 이미 정의되지 않은 한 오류가 발생할 것이다.XML은 또한x
16진수에서 숫자 참조는 소문자(예:ਛ
보다는ਛ
. XML 응용프로그램인 XHTML은 XML의 사전 정의된 엔티티와 함께 HTML 엔티티 세트를 지원한다.
참고 항목
- Charset 스니핑 – 문자 인코딩 메타데이터를 사용할 수 없을 때 많은 브라우저에서 사용됨
- 유니코드 및 HTML
- 언어코드
- XML 및 HTML 문자 엔티티 참조 목록
참조
- ^ "Content-Type", Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content, IETF, June 2014, retrieved 30 July 2014
- ^ "Apache Module mod_charset_lite".
- ^ a b c "Specifying the document's character encoding", HTML5, World Wide Web Consortium, 14 December 2017, retrieved 28 May 2018
- ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yergeau, F. (26 November 2008), "Prolog and Document Type Declaration", XML, W3C, retrieved 8 March 2010
- ^ "HTML5 prescan a byte stream to determine its encoding".
- ^ "8.2.2.3. Character encodings". HTML 5.1 Standard. W3C.
- ^ "8.2.2.3. Character encodings". HTML 5 Standard. W3C.
- ^ a b c "12.2.3.3 Character encodings". HTML Living Standard. WHATWG.
- ^ a b c d e f van Kesteren, Anne. "4.2: Names and labels". Encoding Standard. WHATWG.
- ^ a b van Kesteren, Anne. "10.2.2. gb18030 encoder". Encoding Standard. WHATWG.
- ^ a b van Kesteren, Anne. "5. Indexes (§ index gb18030)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "10.2.1. gb18030 decoder". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "5. Indexes (§ index Big5 pointer)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "5. Indexes (§ Index jis0208)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "5. Indexes (§ Index ISO-2022-JP katakana)". Encoding Standard. WHATWG.
- ^ a b van Kesteren, Anne. "12.2.1. ISO-2022-JP decoder". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "12.2.2. ISO-2022-JP encoder". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "5. Indexes (§ index EUC-KR)". Encoding Standard. WHATWG.
- ^ a b van Kesteren, Anne. "4.3. Output encodings". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "14.4. UTF-16LE". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "6. Hooks for standards (§ decode)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "14.5. x-user-defined". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "9. Legacy single-byte encodings (§ Note)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "index KOI8-U visualization". Encoding Standard. WHATWG.
- ^ "Bug 17053: Support KOI8-RU mapping for KOI8-U". W3C Bugzilla. 19 August 2015.
- ^ van Kesteren, Anne. "10.1. GBK". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "5. Indexes (§ Index jis0212)". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "14.1: replacement". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "2: Security background". Encoding Standard. WHATWG.
- ^ van Kesteren, Anne. "4.2: Names and labels (§ replacement)". Encoding Standard. WHATWG.
- ^ Bray, T.; Paoli, J.; Sperberg-McQueen, C.; Maler, E.; Yergeau, F. (26 November 2008), "Character and Entity References", XML, W3C, retrieved 8 March 2010