월드 와이드 웹 문자 모델: 문자열 일치

W3C 최초 공개 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-charmod-norm-20260716/
최신 게시 버전:
https://www.w3.org/TR/charmod-norm/
최신 편집자 초안:
https://w3c.github.io/charmod-norm/
이력:
https://www.w3.org/standards/history/charmod-norm/
커밋 이력
편집자:
Addison Phillips (초빙 전문가)
피드백:
GitHub w3c/charmod-norm (풀 리퀘스트, 새 이슈, 열린 이슈)

초록

이 문서는 월드 와이드 웹 문자 모델 1.0: 기본 원칙 [CHARMOD]을 기반으로 하여 명세 작성자, 소프트웨어 개발자 및 콘텐츠 개발자에게 월드 와이드 웹에서의 문자열 동일성 일치에 관한 공통 참조를 제공함으로써 상호 운용성을 향상시킵니다.

이 문서의 상태

이 절에서는 이 문서가 게시된 시점의 상태를 설명합니다. 현재 W3C 간행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

의견을 더 쉽게 추적할 수 있도록 각 의견마다 별도의 이슈 또는 이메일을 작성하고, URL을 사용하여 의견을 제시하는 절을 가리켜 주십시오.

이 문서는 국제화 작업 그룹에서 권고안 트랙을 사용하여 최초 공개 작업 초안으로 게시했습니다.

최초 공개 작업 초안으로 게시되었다고 해서 W3C 및 그 회원들이 이를 승인했다는 의미는 아닙니다.

이 문서는 초안이며 언제든지 다른 문서에 의해 업데이트되거나 대체되거나 폐기될 수 있습니다. 진행 중인 작업 이외의 문서로 이 문서를 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에서 작성했습니다. W3C는 그룹의 결과물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있습니다. 자신이 보유한 실제 지식에 따라 해당 특허가 필수 청구항을 포함한다고 판단하는 개인은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

1.1 목표 및 범위

월드 와이드 웹 문자 모델의 목표는 언어, 문자, 표기 체계 또는 문화적 관습과 관계없이 모든 사람이 W3C의 보편적 접근 목표에 따라 웹을 사용할 수 있도록 하는 것입니다. 이 목표를 달성하기 위한 기본 전제 조건 중 하나는 전 세계에서 사용되는 문자를 명확하게 정의되고 충분히 이해된 방식으로 전송하고 처리할 수 있는 것입니다.

참고

이 문서는 월드 와이드 웹 문자 모델: 기본 원칙 [CHARMOD]을 기반으로 합니다. 이 문서를 올바르게 이해하고 적용하려면 해당 문서의 개념을 이해하는 것이 중요합니다.

월드 와이드 웹 문자 모델의 이 부분에서는 문자열 일치, 즉 명세 또는 구현이 두 문자열 값이 서로 같은지 다른지를 정의하는 과정을 다룹니다. 의미상 동등한 텍스트가 서로 다르게 인코딩될 수 있는 방식과 이것이 형식 언어에서 중요한 일치 연산에 미치는 영향을 설명합니다. 이러한 형식 언어에는 웹을 구성하는 형식과 프로토콜에서 사용되는 언어가 포함됩니다.

이 명세의 주요 대상 독자는 W3C 명세 개발자입니다. 이 명세 또는 그 일부는 다른 W3C 명세에서 참조할 수 있으며, W3C 명세뿐만 아니라 다른 명세에 대한 적합성 기준도 정의합니다.

이 명세의 다른 대상 독자에는 소프트웨어 개발자, 콘텐츠 개발자 및 W3C 외부의 명세 작성자가 포함됩니다. 소프트웨어 개발자와 콘텐츠 개발자는 W3C 명세를 구현하고 사용합니다. 이 명세는 W3C 명세를 구현하고 사용하는 구현(소프트웨어)과 콘텐츠에 대한 일부 적합성 기준을 정의합니다. 또한 소프트웨어 개발자와 콘텐츠 개발자가 W3C 명세의 문자 관련 조항을 이해하는 데 도움을 줍니다.

이 명세에서 설명하는 문자 모델은 명세 작성자, 소프트웨어 개발자 및 콘텐츠 개발자에게 월드 와이드 웹에서 일관되고 상호 운용 가능한 텍스트 조작을 위한 공통 참조를 제공합니다. 이 세 그룹은 협력하여 전 세계에서 접근할 수 있는 웹을 구축할 수 있습니다.

1.2 이 문서의 구조

이 문서는 문서 형식에서 문자열 동일성 일치를 위한 규칙과 절차를 정의함으로써 이 문제와 관련된 웹의 기본 구성 요소 중 하나를 정의합니다. 이러한 규칙은 문서 형식에서 사용되는 식별자와 구조적 마크업(구문 콘텐츠)을 일관되게 처리할 수 있도록 설계되었으며 명세 작성자를 대상으로 합니다. 이 절은 구현자를 대상으로 합니다.

이 문서는 두 개의 주요 절로 나뉩니다.

첫 번째 절에서는 문자열 일치와 관련된 문제, 이러한 문제에 대한 유니코드와 대소문자 접기의 영향, 그리고 문제를 해결하는 데 사용할 수 있는 다양한 쟁점과 정규화 메커니즘을 설명합니다.

두 번째 절에서는 여러 W3C 명세에서 정의된 문서 형식과 같은 형식 언어에서 사용할 문자열 동일성 일치의 요구 사항과 권고 사항을 제공합니다. 이는 주로 웹이 올바르게 작동하도록 하고 문서 작성자에게 일관된 결과를 제공하는 것과 관련됩니다.

1.3 배경

이 절에서는 이 명세에서 다루는 주제에 관한 역사적 배경을 제공합니다.

문자 모델의 핵심에는 유니코드 표준 [Unicode]과 ISO/IEC 10646 [ISO10646]에서 공동으로 정의한 범용 문자 집합(UCS)이 있습니다. 이 문서에서는 유니코드를 범용 문자 집합의 동의어로 사용합니다. 성공적인 문자 모델은 전 세계의 다양한 표기 체계, 문자 및 언어로 여러 플랫폼에서 작성된 웹 문서를 전 세계 웹 사용자가 교환하고 읽고 검색할 수 있도록 합니다.

유니코드 표준의 첫 몇 장은 [Unicode] 유용한 배경 자료를 제공합니다.

이 명세의 중요한 부분을 개발하는 데 기초가 된 요구 사항에 대한 자세한 내용은 문자열 동일성 일치 및 문자열 색인 요구 사항 [CHARREQ]을 참조하십시오.

1.4 용어 및 표기법

이 절에서는 이 문서에만 적용되는 용어와 표기법을 설명합니다.

웹은 텍스트 기반 형식과 프로토콜을 기반으로 구축됩니다. 문자열 일치 또는 검색을 효과적으로 설명하려면 주어진 형식이나 프로토콜 내의 서로 다른 텍스트 유형에 관해 논의할 수 있도록 하는 용어를 확립해야 합니다. 유형에 따라 요구 사항과 세부 정보가 크게 다르기 때문입니다.

유니코드 코드 포인트(또는 "코드 포인트")는 각 유니코드 문자에 할당된 숫자 값을 의미합니다. 유니코드 코드 포인트의 범위는 0에서 0x10FFFF까지입니다. 문자 인코딩 용어에 관한 자세한 설명은 [CHARMOD]의 4.1절을 참조하십시오.

유니코드 코드 포인트는 U+hhhh로 표기하며, 여기서 hhhh는 최소 4개에서 최대 6개의 16진수 숫자로 이루어진 시퀀스입니다. 예를 들어 문자 [U+20AC EURO SIGN]의 코드 포인트는 U+20AC이고, 문자 😺 [U+1F63A SMILING CAT FACE WITH OPEN MOUTH]의 코드 포인트는 U+1F63A입니다.

이 문서의 예시에서 사용되는 일부 문자는 특정 기기나 디스플레이에서 의도한 대로 표시되지 않을 수 있습니다. 일반적으로 이는 로컬에 해당 문자 전용 글꼴이 설치되어 있지 않거나 특정 렌더링 시스템에 다른 제한이 있기 때문입니다. 이 문서는 여러 비라틴 문자의 대체 글리프를 제공하기 위해 웹 글꼴을 사용하지만, 기기가 해당 글꼴의 표시를 지원하지 않을 수 있습니다. 편집자는 가능한 범위에서 이러한 경우에도 예시를 이해할 수 있도록 노력했습니다.

레거시 문자 인코딩은 유니코드 문자 집합의 전체 문자 레퍼토리를 인코딩하지 않는 문자 인코딩 형식입니다.

트랜스코더는 두 문자 인코딩 사이에서 텍스트를 변환하는 절차입니다. 이 문서에서는 대부분 레거시 문자 인코딩에서 UTF-8과 같은 유니코드 인코딩 형식으로 변환하는 절차를 의미합니다.

자연어는 인간이 사용하는 음성, 문자 또는 수화 의사소통입니다(여기 [LTLI]도 참조하십시오).

구문 콘텐츠는 형식이나 프로토콜의 구조에 속하는 문서 형식 또는 프로토콜 내의 모든 텍스트입니다. 이 정의에는 일반적으로 "마크업"으로 간주되는 값뿐만 아니라 HTTP 헤더의 필드 이름과 같은 다른 값도 포함될 수 있습니다. 구문 콘텐츠는 형식 또는 프로토콜의 구조를 구성하는 모든 문자로 이루어집니다. 예를 들어 <> 및 이 기호가 둘러싸는 요소 이름과 여러 속성은 HTML 문서의 구문 콘텐츠에 포함됩니다.

구문 콘텐츠는 일반적으로 하나 이상의 명세에서 정의되며, 주어진 프로토콜 또는 형식에 대해 정의되고 예약된 키워드뿐만 아니라 문서의 "콘텐츠"가 아니라 구조를 형성하기 위해 문서 작성자가 정의한 문자열 토큰과 식별자도 포함합니다.

어휘는 형식 또는 프로토콜에서 예약된 키워드 및 식별자와 같은 사용자 제공 값의 할당 규칙 목록입니다. 여기에는 서로 다른 위치에 나타날 수 있는 문자의 범위, 순서 또는 유형에 대한 제한이 포함될 수 있습니다.

예를 들어 HTML은 요소와 속성의 이름 및 열거형 속성 값을 정의하며, 이러한 값은 HTML 구문 콘텐츠의 "어휘"를 정의합니다. 또 다른 예로 ECMAScript는 식별자 또는 변수 이름의 시작 부분이나 본문에 나타날 수 있는 문자의 범위를 제한합니다. 문자열 리터럴의 값과 같은 다른 경우에는 서로 다른 규칙을 적용합니다.

어휘 내의 값은 크게 두 종류로 나뉩니다. 사람이 보고 읽거나 상호 작용하도록 의도된 값으로, 자연어 텍스트를 포함할 것으로 예상할 수 있는 값과, 애플리케이션이나 프로토콜 내부에서 사용되며 사람이 상호 작용하도록 의도되지 않은 값입니다.

사용자 대상 식별자어휘에서 사용자가 정의하거나 사용자에게 할당한 식별자로, 최종 사용자에게 적어도 잠재적으로 표시되도록 의도된 식별자입니다. 따라서 이는 현지화 가능한 콘텐츠입니다.

애플리케이션 내부 식별자어휘에서 사용자가 정의하거나 사용자에게 할당한 식별자로, 문서 형식 또는 프로토콜 내부에서 사용되며 사람이 상호 작용하도록 의도되지 않은 식별자입니다. 이러한 값은 일반적으로 현지화 가능한 콘텐츠가 아닙니다.

사용자 제공 값은 주어진 형식 또는 프로토콜의 예약된 키워드와 구별되는 값으로, 사용자가 할당하는 구문 콘텐츠 내의 예약되지 않은 어휘입니다. 사용자는 일반적으로 사용자 제공 값으로 자신이 선호하는 자연어의 단어나 구문을 사용할 수 있을 것으로 기대합니다. 이러한 이유로 [CHARMOD]은 "명세는 U+0000부터 U+10FFFF까지의 전체 유니코드 코드 포인트 범위에서 코드 포인트를 임의로 제외해서는 안 됩니다."라고 권고합니다.

현지화 가능한 콘텐츠는 사람이 읽을 수 있는 텍스트로 의도된 문서 콘텐츠를 의미하며, 문서 구조의 일부를 형성하는 주변 또는 내장된 구문 콘텐츠는 포함하지 않습니다. 구문 콘텐츠 내부에 현지화 가능한 콘텐츠가 포함될 수 있다는 점에 유의하십시오. 예를 들어 [HTML] img 요소의 alt 속성에 이미지 설명이 포함될 수 있습니다.

이 문서의 맥락에서 리소스현지화 가능한 콘텐츠와 이를 둘러싸거나 포함하는 식별자와 같은 구문 콘텐츠를 모두 포함하는 특정 문서, 파일 또는 프로토콜 "메시지"입니다. 예를 들어 일부 CSS와 JavaScript가 포함된 몇 개의 script 태그를 함께 포함하는 HTML 문서에서 파일로 간주한 전체 HTML 문서가 리소스입니다. 이 용어는 [RFC3986]에서 사용되는 '리소스'라는 용어와 의도적으로 유사하지만, 여기에서는 더 느슨하게 적용됩니다.

자소는 일반적인 사용자가 단일 단위(문자)로 인식하는 텍스트의 시각적 표현에서 하나 이상의 문자로 이루어진 시퀀스입니다. 자소는 정렬 또는 텍스트 선택과 같은 여러 텍스트 연산에서 중요하므로 사용자가 인식하는 각 문자 사이의 경계를 계산할 수 있어야 합니다. 유니코드는 유니코드 표준 부록 #29: 텍스트 분할 [UAX29]에서 자소를 계산하는 기본 메커니즘을 정의하며, 이 근사값을 자소 클러스터라고 부릅니다. 두 가지 유형의 기본 자소 클러스터가 정의되어 있습니다. 달리 명시하지 않는 한 이 문서의 자소 클러스터는 확장 기본 자소 클러스터를 의미합니다. 자소 클러스터에 관한 설명은 유니코드 표준의 2장에도 제공됩니다 [Unicode]. 유니코드 표준 버전 8.0의 2.11절 끝부분도 참조하십시오.

자연어마다 요구 사항이 다르므로 자소 클러스터에도 맞춤화가 필요할 수 있습니다. 예를 들어 슬로바키아어 사용자는 기본적으로 두 개의 자소 클러스터인 "ch"를 하나의 자소 클러스터로 취급하고자 할 수 있습니다. 문자열 콘텐츠의 언어와 최종 사용자의 기본 설정 사이의 상호 작용은 복잡할 수 있습니다.

1.4.1 용어 예시

이 절에서는 위에서 정의한 일부 용어를 예시로 설명합니다. 설명을 위해 다음의 작은 HTML 파일을 예시로 사용합니다. 참조할 수 있도록 줄 번호가 추가되어 있습니다.

1 <html lang="en" dir="ltr">

2 <head>

3   <meta charset="UTF-8">

4   <title>Shakespeare</title>

5 </head>

6 <body>

7   <img src="shakespeare.jpg" alt="William Shakespeare" id="shakespeare_image">

8   <p>What&#x2019;s in a name? That which we call a rose by any other name would smell as sweet.</p>

9 </body>

10 </html>

  • 검은색 사각형 내부의 모든 항목, 즉 이 HTML 파일의 모든 내용은 리소스에 포함됩니다.
  • 이 경우 구문 콘텐츠에는 모든 HTML 마크업이 포함됩니다. 구문 콘텐츠에 포함되지 않는 문자열은 4번째 줄의 "Shakespeare"라는 단어와 8번째 줄의 "What’s in a name? That which we call a rose by any other name would smell as sweet."라는 문장뿐입니다. 8번째 줄의 문장에 포함된 HTML 엔티티 &#x2019;는 구문 콘텐츠의 일부입니다.
  • 현지화 가능한 콘텐츠회색 배경의 굵은 파란색 글꼴로 표시됩니다. 구문 콘텐츠가 아닌 항목 외에도 7번째 줄의 alt 값 (William Shakespeare)은 현지화 가능한 콘텐츠입니다.
  • 사용자 제공 값은 기울임꼴로 표시됩니다. 이 경우 7번째 줄에는 img 태그의 src, altid 속성 값이라는 세 개의 사용자 제공 값이 있습니다. 또한 1번째 줄의 lang 속성 값과 3번째 줄의 charset 속성 값도 사용자 제공 값입니다.
  • 어휘빨간색 밑줄로 표시됩니다. HTML 문서의 어휘는 [HTML]에 정의된 요소와 속성 및 위 예시의 dir 속성 값 ltr과 같은 일부 속성 값입니다.
참고

위의 모든 텍스트, 즉 텍스트 파일의 모든 텍스트가 리소스를 구성합니다. 특정 리소스에는 현지화 가능한 콘텐츠가 전혀 없을 수 있습니다. 예를 들어 주황색 사각형으로 스타일이 지정된 비어 있는 네 개의 div 요소로만 구성된 HTML 문서가 이에 해당합니다. 반대로 리소스에 구문 콘텐츠가 전혀 없고 현지화 가능한 콘텐츠로만 구성될 수도 있습니다. 예를 들어 Hamlet의 독백이 들어 있는 일반 텍스트 파일이 이에 해당합니다. 또한 HTML 엔티티 &#x2019;는 현지화 가능한 콘텐츠에 나타나며 이 리소스에서 현지화 가능한 콘텐츠와 구문 콘텐츠 모두에 속합니다.

1.5 적합성

비규범적으로 표시된 절뿐만 아니라 이 명세의 모든 작성 지침, 도표, 예시 및 참고 사항은 비규범적입니다. 이 명세의 나머지 모든 내용은 규범적입니다.

이 문서의 핵심 용어 할 수 있습니다, 반드시 해야 합니다, 해서는 안 됩니다, 선택 사항입니다, 권장됩니다, 해야 합니다하지 않아야 합니다는 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 합니다.

이 문서는 다른 명세의 작성자를 위한 모범 사례와 구현자 및 콘텐츠 작성자를 위한 권고 사항을 설명합니다. 이러한 모범 사례는 국제화 작업 그룹의 명세 개발자를 위한 국제화 모범 사례 [INTERNATIONAL-SPECS]에서도 확인할 수 있으며, 이 문서는 W3C 명세의 모든 국제화 모범 사례를 위한 일반 참조로 사용됩니다.

이 문서의 모범 사례에서는 특정 권고에 관한 국제화 작업 그룹의 의도를 명확히 하기 위해 [RFC2119] 키워드를 사용합니다. 이 문서의 권고 사항을 따르면 W3C의 "광범위한 검토" 과정, 구현 또는 작성자가 제작하는 콘텐츠에서 발생하는 문제를 방지하는 데 도움이 될 수 있습니다. 이 문서 자체는 규범적이지 않으며 수시로 개정될 수 있습니다.

명세는 다음 조건을 충족하는 경우 이 문서에 대한 적합성을 주장할 수 있습니다.

  1. 명령형 표현이 반드시 해야 합니다 또는 해서는 안 됩니다인 경우 [S]가 앞에 붙은 적합성 기준을 위반하지 않습니다.
  2. 명령형 표현이 해야 합니다, 하지 않아야 합니다 또는 권장됩니다인 기준에서 벗어나는 모든 경우에 그 이유를 문서화합니다.
  3. 구현이 이 문서를 준수하도록 적합성 요구 사항을 설정합니다.
  4. 콘텐츠가 이 문서를 준수하도록 적합성 요구 사항을 설정합니다.
참고

명세에 부과된 요구 사항은 해당 명세에 대한 적합성을 주장하는 구현이나 콘텐츠에 간접적으로 요구 사항을 부과할 수 있습니다.

이 명세에 절차적 설명이 포함된 경우 이는 원하는 외부 동작을 지정하는 방법으로 이해해야 합니다. 관찰 가능한 동작에 영향을 주지 않는 한 구현은 동일한 결과를 얻기 위해 다른 방법을 사용할 수 있습니다.

2. 문자열 일치 문제

웹은 주로 문자 데이터를 기반으로 하는 문서 형식과 프로토콜로 구성됩니다. 이러한 형식이나 프로토콜은 어떤 형태의 구조적 마크업 또는 구문 콘텐츠를 포함하는 텍스트 파일을 중심으로 구성된 리소스 집합으로 볼 수 있습니다. 이러한 구문 콘텐츠 또는 문서 데이터를 처리하려면 일치(정규 표현식 포함), 색인, 검색, 정렬 등과 같은 문자열 기반 연산이 필요합니다.

사용자, 특히 구현자는 유사한 문자열이 일치하거나 일치하지 않는 방식 또는 텍스트, 특히 구문 콘텐츠에 적용할 수 있는 서로 다른 변환의 효과에 대해 단순한 기대를 하는 경우가 있습니다. 이는 웹에서 수행되는 여러 유형의 텍스트 처리에도 적용됩니다.

기본적으로 웹은 문서에서 텍스트를 표현할 수 있는 서로 다른 방식에 민감하므로, 동일한 텍스트를 표현하는 여러 방식을 고려하지 않으면 사용자를 혼란스럽게 하거나 예상하지 못한 답답한 결과를 초래할 수 있습니다. 다음 절에서 이 문서는 웹의 텍스트에 대한 사용자 인식과 웹이 의존하는 문자열 처리 모두에 영향을 주는 여러 텍스트 변형 유형을 살펴봅니다.

2.1 대소문자 매핑 및 대소문자 접기

일부 문자와 표기 체계는 대문자, 소문자 및 제목 대소문자를 구분합니다. 인도의 브라흐미계 문자, 아랍 문자, 중국어, 일본어 또는 한국어를 표기하는 문자를 포함한 대부분의 문자는 대소문자를 구분하지 않지만, 일부 중요한 문자는 이를 구분합니다. 이러한 문자의 예에는 이 문서의 대부분에서 사용되는 라틴 문자와 그리스 문자, 아르메니아 문자 및 키릴 문자가 있습니다.

대소문자 매핑은 문자를 대문자, 소문자 또는 제목 대소문자와 같은 특정 대소문자로 변환하는 과정입니다. 대소문자를 구분하는 문자에 대해 유니코드는 각 유니코드 코드 포인트에 기본 대문자, 소문자 및 제목 대소문자 매핑을 정의합니다. 대소문자 매핑은 처음에는 간단해 보입니다. 그러나 다양한 언어에서 유니코드의 전체 범위를 처리할 때 고려해야 할 변형이 있습니다.

참고

대소문자 접기는 대소문자만 다른 두 텍스트를 비교 목적으로 동일하게 만드는 과정입니다. 즉, 문자열 일치를 위한 과정입니다. 이는 주로 표시를 목적으로 하는 대소문자 매핑과 구별됩니다. 기본 대소문자 매핑과 마찬가지로 유니코드는 각 유니코드 코드 포인트에 기본 대소문자 접기 매핑을 정의합니다. 유니코드는 두 가지 형태의 대소문자 접기를 정의하며, 아래에서 이를 살펴봅니다.

대부분의 문자는 대소문자를 구분하지 않으므로 대소문자 매핑과 마찬가지로 대부분의 유니코드 코드 포인트에는 대소문자 접기가 필요하지 않습니다. 대소문자 접기가 있는 코드 포인트의 대부분은 다른 하나의 일치하는 코드 포인트, 일반적으로 소문자 코드 포인트로 간단하고 직접 매핑됩니다. 유니코드는 이 접기 집합을 공통이라고 부릅니다. 유니코드에서 정의한 두 가지 대소문자 접기 유형 모두에 이 집합이 포함되기 때문입니다.

일부 문자는 하나의 유니코드 코드 포인트를 두 개 이상의 코드 포인트로 매핑하는 대소문자 접기를 가집니다. 이 대소문자 접기 집합을 전체 대소문자 접기라고 합니다. 전체공통 대소문자 접기를 함께 사용하여 모든 유니코드에 대한 기본 대소문자 접기를 제공합니다. 이 문서에서는 이 대소문자 접기 형식을 전체 대소문자 접기 또는 유니코드 전체라고 합니다.

일부 애플리케이션은 대소문자 접기 연산을 수행할 때 추가 저장 공간을 할당할 수 없으므로, 유니코드는 일반적으로 더 많거나 적은 코드 포인트로 접히는 코드 포인트를 비교 목적으로 하나의 코드 포인트에 매핑하는 단순 대소문자 접기를 제공합니다. 전체 접기와 달리 이 접기는 언제나 텍스트의 콘텐츠 및 잠재적으로 의미를 변경합니다. 전체 대소문자 접기와 마찬가지로 단순 대소문자 접기 또는 유니코드 단순 대소문자 접기는 유니코드의 전체 범위를 다루기 위해 단순공통 매핑을 결합한 것입니다. 유니코드 단순은 웹에서 사용하기에 적합하지 않습니다.

대소문자 접기는 나중에 복구할 수 없는 정보를 문자열에서 제거합니다. 예를 들어 독일어에서 두 개의 s 문자가 접기 전 텍스트의 ß를 반드시 나타내는 것은 아닙니다.

2.1.1 언어 민감성

대소문자 매핑과 대소문자 접기의 또 다른 측면은 언어에 따라 달라질 수 있다는 것입니다. 유니코드는 인코딩된 각 문자에 기본 대소문자 매핑과 대소문자 접기를 정의하지만, 이는 기본값일 뿐 모든 경우에 적합하지는 않습니다. 일부 언어에서는 특정 언어적 요구 사항을 충족하도록 대소문자 매핑을 맞춤화해야 합니다. 한 가지 예로 라틴 문자로 표기하는 튀르크어가 있습니다.

위 예시 및 이 문서는 일반적으로 일치 목적의 대소문자 접기에 초점을 맞추지만, 대소문자 매핑도 언어별로 다르다는 점에 유의하십시오. 튀르키예에서 두 번째로 큰 도시의 이름은 "Diyarbakır"이며, 이 이름에는 점이 있는 문자와 점이 없는 문자 i가 모두 포함됩니다.

2.1.2 대소문자 접기의 용도

일부 문서 형식이나 프로토콜은 자신이 정의하는 어휘 또는 해당 형식이나 프로토콜에서 허용하는 사용자 제공 값의 대소문자 변형을 무시하여 상호 운용성을 지원하거나 콘텐츠 작성자에게 편의를 제공하려고 합니다.

경우에 따라 대소문자의 차이가 의미상 중요하지 않거나 사용자가 완전히 제어할 수 없는 방식으로 달라질 수 있습니다. 이는 특히 문서를 검색할 때 흔하지만 식별자와 같은 사용자 또는 콘텐츠가 생성한 값을 일치시키는 규칙을 정의할 때도 적용될 수 있습니다. 이러한 상황에서는 대소문자를 구분하지 않는 일치가 더 적합할 수 있습니다.

어휘를 정의할 때 중요한 고려 사항 중 하나는 값이 유니코드의 ASCII [ASCII] 하위 집합으로 제한되는지, 아니면 어휘에서 라틴 문자의 악센트나 비라틴 문자를 포함하는 광범위한 유니코드와 같이 더 복잡한 대소문자 접기 요구 사항을 가질 수 있는 문자의 사용을 허용하는지입니다. 이러한 서로 다른 요구 사항을 처리하기 위해 이 문서는 문서 형식 또는 프로토콜에서 문자열 동일성 일치를 목적으로 하는 네 가지 대소문자 접기 일치 유형을 정의합니다.

대소문자를 구분하는 일치: 대소문자 접기 없이 코드 포인트를 직접 비교합니다.

ASCII 대소문자를 구분하지 않는 일치는 [INFRA]에 정의되어 있습니다. 이 정의는 0x41부터 0x5A(A부터 Z) 범위의 모든 ASCII 코드 포인트를 0x61부터 0x7A(a부터 z) 범위의 해당 코드 포인트에 매핑한 것처럼 두 코드 포인트 시퀀스를 비교합니다. 어휘 자체가 ASCII로 제한되는 경우 ASCII 대소문자를 구분하지 않는 일치가 필요할 수 있습니다.

유니코드 대소문자를 구분하지 않는 일치는 두 입력 시퀀스 모두에 유니코드 전체 대소문자 접기를 적용한 것처럼 두 코드 포인트 시퀀스를 비교합니다.

언어에 민감한 대소문자 일치는 문서 형식 또는 프로토콜에 구문 콘텐츠의 언어 정보가 포함되고 언어에 민감한 대소문자 접기를 합리적으로 적용할 수 있는 드문 경우에 유용합니다. 이러한 대소문자 접기는 유니코드 컨소시엄의 공통 로케일 데이터 저장소 [UAX35] 프로젝트에 정의되어 있습니다.

대소문자 접기 처리 방법에 대한 조언은 3.2.6 대소문자 접기에 대한 추가 고려 사항을 참조하십시오.

2.2 유니코드 정규화

유니코드 텍스트에는 또 다른 종류의 변형이 발생할 수 있습니다. 경우에 따라 여러 서로 다른 유니코드 코드 포인트 시퀀스를 사용하여 동일한 추상 문자를 나타낼 수 있습니다. 코드 포인트를 비교하여 텍스트를 검색하거나 일치시키는 경우 이러한 인코딩 변형으로 인해 사용자가 동일할 것으로 예상하는 텍스트 값이 일치하지 않을 수 있습니다.

애플리케이션은 서로 다른 코드 포인트 시퀀스를 사용하는 텍스트 사이의 의미적 동등성을 찾아야 하므로, 유니코드는 의미상 동등한 두 텍스트를 동일하게 만드는 수단인 유니코드 정규화 형식 [UAX15]을 정의합니다.

리소스는 해당 명세와 웹 구현에서 텍스트의 유니코드 정규화를 요구하지 않고, 이후 구문 콘텐츠( 사용자 제공 값 포함) 및 현지화 가능한 콘텐츠를 처리할 때 사용되는 문자열 일치 알고리즘을 고려하지 않기 때문에 이러한 변형의 영향을 받기 쉽습니다. 따라서 콘텐츠 개발자는 이후의 문제를 방지하기 위해 일관된 표현을 제공해야 합니다.

그러나 텍스트로 볼 때 이러한 차이는 일반적으로 보이지 않으므로 사용자가 특정 리소스 또는 리소스 집합이 일관된 텍스트 표현을 사용하는지 확인하기 어려울 수 있습니다. 따라서 도구와 구현은 시각적으로나 논리적으로 동등하여 사용자의 관점에서 일치해야 하는 문자열이 서로 다른 값으로 간주될 때 사용자가 겪는 어려움을 고려해야 합니다. 사용자가 이러한 차이를 확인하거나 적절히 정규화할 수 있는 수단을 제공하면 최종 사용자가 원본 문서의 보이지 않는 차이로 인해 발생하는 실패를 방지할 수 있습니다. 예를 들어 W3C 검사기는 HTML 문서가 유니코드 정규화 형식 C로 완전히 정규화되지 않은 경우 경고합니다.

2.2.1 정준 동등성과 호환성 동등성

유니코드는 문자 사이에 두 가지 유형의 동등성, 즉 정준 동등성호환성 동등성을 정의합니다.

정준 동등성은 동일한 추상 문자를 나타내는 유니코드 코드 포인트 또는 유니코드 코드 포인트 시퀀스 사이의 기본적인 동등성입니다. 정준적으로 동등한 시퀀스는 이상적으로 동일한 시각적 외관을 가져야 하지만 여러 요인으로 인해 다소 다르게 보일 수 있으며, 동일한 것으로 취급하고 처리해야 합니다. 유니코드는 서로 다르게 인코딩되었지만 정준적으로 동등한 두 텍스트 사이의 이러한 기본 차이를 제거하는 정준 분해라는 과정을 정의합니다.

유니코드에서 정의한 정준 동등성의 예는 다음과 같습니다.

  • Ç 미리 결합된 시퀀스와 결합 시퀀스. 일부 문자는 기본 문자 뒤에 하나 이상의 결합 문자를 추가하여 구성할 수 있습니다. 동일한 문자가 별도의 "미리 결합된" 문자로 인코딩되는 경우도 있습니다. 이 예에서 문자 Ç [U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA]는 기본 문자 C [U+0043 LATIN CAPITAL LETTER C] 뒤에 ◌̧ [U+0327 COMBINING CEDILLA​]가 이어지는 문자 시퀀스와 정준적으로 동등합니다. 이러한 동등성은 여러 결합 마크가 있는 문자에도 적용될 수 있습니다.
  • q̣̇q̣̇ 결합 마크의 순서. 기본 문자가 여러 결합 마크로 수정되는 경우 결합 마크의 순서가 별개의 문자를 나타내지 않을 수 있습니다. 여기서 시퀀스 q [U+0071 LATIN SMALL LETTER Q]  ̇ [U+0307 COMBINING DOT ABOVE​]  ̣ [U+0323 COMBINING DOT BELOW​]q [U+0071 LATIN SMALL LETTER Q]  ̣ [U+0323 COMBINING DOT BELOW​]  ̇ [U+0307 COMBINING DOT ABOVE​]는 결합 마크의 순서가 다르더라도 동등합니다. 이 예시는 신중하게 선택된 것입니다. 위쪽 점 문자와 아래쪽 점 문자는 기본 문자의 서로 반대쪽에 있습니다. 동일한 쪽에 있는 결합 발음 구별 부호의 순서는 종종 위치적 의미를 가지지만, 순서가 표현에 영향을 주지 않는 경우도 있습니다.
  • Ω 단일 항목 매핑. 이는 레거시 문자 인코딩을 지원하기 위해 그 밖에는 동등한 문자를 별도로 인코딩해야 했던 필요에서 비롯됩니다. 이 예에서 옴 기호 [U+2126 OHM SYMBOL]는 그리스 문자 오메가 Ω [U+03A9 GREEK CAPITAL LETTER OMEGA]와 정준적으로 동등하고 외관도 동일합니다. 또 다른 단일 항목의 예는 위의 인코딩 변형 예시에 있는 [U+212B ANGSTROM SIGN]입니다.
  • 가 한글. 한글은 한국어를 표기하는 데 사용됩니다. 이 문자는 논리적으로 구성되며 각 음절은 자음과 모음을 나타내는 특정 하위 부분으로 이루어진 대체로 정사각형인 자소입니다. 자모라고 하는 이러한 하위 부분은 유니코드에 인코딩되어 있습니다. 미리 결합된 음절도 인코딩되어 있습니다. 따라서 음절 [U+AC00 [Hangul Syllable, First]]는 구성 자모 가 [U+1100 HANGUL CHOSEONG KIYEOK + U+1161 HANGUL JUNGSEONG A]와 정준적으로 동등합니다.

호환성 동등성은 동일한 추상 문자를 나타내지만 시각적 외관이나 동작이 다를 수 있는 유니코드 문자 또는 유니코드 문자 시퀀스 사이의 더 약한 동등성입니다. 일반적으로 호환성 분해라는 과정은 위 첨자, 아래 첨자, 회전, 원으로 둘러싸인 형태 등과 같은 서식 변형을 제거하지만 다른 변형도 발생합니다. 호환성 분해를 가진 문자는 많은 경우 의미적 성격의 구분을 나타냅니다. 따라서 별개의 문자를 호환성 분해 결과로 대체하면 텍스트의 의미가 달라질 수 있습니다. 호환성 분해 후 동등해지는 텍스트는 이전에는 동일한 것으로 인식되지 않았을 수 있으며, 형식 언어는 이를 동등한 것으로 취급해서는 안 됩니다.

위 표에 표시된 문자는 문맥이나 스타일에 따른 표시 변형일 뿐인 것이 아니라 실제 유니코드 코드 포인트라는 점에 유의해야 합니다. 각 문자는 여러 레거시 문자 인코딩과의 호환성을 위해 유니코드에 인코딩되었습니다. 이러한 문자는 호환성 문자가 아닌 대응 문자에 적용되는 일반적인 표시 처리와 혼동해서는 안 됩니다.

예를 들어 대부분의 아랍 문자 텍스트는 유니코드의 아랍 문자 블록 (U+0600부터 시작)에 있는 문자를 사용합니다. 텍스트를 표시하는 데 사용되는 실제 글리프는 "형태 결정"이라는 과정에서 단어 내부의 위치 (시작형, 중간형, 종결형 또는 독립형)에 따라 글꼴과 텍스트 처리 논리를 사용하여 선택됩니다. 위 표에는 아랍 문자 ه [U+0647 ARABIC LETTER HEH]의 네 가지 표시 형식이 표시되어 있습니다. 표시된 문자는 U+FE00 블록의 호환성 문자이며, 각각 특정 "위치" 형태를 나타내고 표시된 네 코드 포인트 모두 일반 아랍 문자 ه [U+0647 ARABIC LETTER HEH]로 호환성 분해됩니다. 이러한 표시 형식은 동등한 표시 형식을 포함하는 레거시 문자 인코딩과 왕복 인코딩 변환을 지원하기 위한 용도로만 사용됩니다. 그 밖의 경우 문자 'heh' 시퀀스를 포함하는 문자열은 일련의 U+0647 코드 포인트로 인코딩되며, 렌더링 시스템과 글꼴이 적절한 형태를 제공합니다.

마찬가지로 반각 및 전각 형식의 변형과 세로쓰기에서 사용하는 회전 문자는 주로 레거시 문자 인코딩과의 호환성을 위해 별도의 코드 포인트로 인코딩됩니다. 이러한 변형은 많은 경우 동아시아 문자 폭 [UAX11]에 설명된 유니코드 속성과 관련됩니다. 세로쓰기 표시 형식에 대한 설명은 유니코드 세로쓰기 텍스트 레이아웃 [UAX50]도 참조하십시오.

위에 표시된 것처럼 호환성 분해를 가진 문자의 경우 K 유니코드 정규화 형식은 텍스트를 "일반적인" 또는 "예상되는" 유니코드 코드 포인트로 변환합니다. 그러나 이러한 호환성 문자가 존재한다고 해서 일반적인 텍스트 레이아웃 및 표시 과정에서 생성되는 비슷한 외관의 변형이 유니코드 정규화의 영향을 받는다는 의미는 아닙니다. 이러한 변형은 영향을 받지 않습니다.

2.2.2 결합과 분해

유니코드에서 정의한 이 두 가지 동등성 유형은 다시 "분해"와 "결합"이라는 또 다른 변형 쌍으로 구분됩니다. "분해"에서는 시각적 문자의 분리 가능한 논리적 부분이 기본 문자와 결합 마크의 시퀀스로 나뉘고 결과 코드 포인트가 고정된 정준 순서로 정렬됩니다. "결합"에서는 먼저 분해를 수행한 다음 특정 규칙에 따라 결합 마크를 기본 문자와 다시 결합합니다.

경고

대략적으로 말하면 NFC는 각 결합 문자 시퀀스, 즉 기본 문자 뒤에 하나 이상의 결합 문자가 이어지는 시퀀스를 가능한 한 정준적으로 동등한 미리 결합된 문자로 대체하도록 정의됩니다.

이것이 의미하지 않는 것을 이해하는 것이 중요합니다. 모든 문자 시퀀스에 미리 결합된 대응 문자가 있는 것은 아니므로 결과 문자 시퀀스에는 여전히 결합 마크가 포함될 수 있습니다. 실제로 앞서 살펴본 것처럼 많은 문자는 이 예시의 데바나가리 모음과 같이 결합 마크를 사용하는 것 외에는 대안이 없습니다. 다른 경우에는 결합 제외 규칙으로 인해 일치하는 미리 결합된 문자가 존재하더라도 특정 기본 문자와 결합 마크가 미리 결합된 문자로 대체되지 않습니다. 예를 들어 일부 인도계 문자는 일치하는 미리 결합된 문자가 존재하더라도 특정한 기본 문자와 발음 구별 부호의 시퀀스를 결합하지 않습니다. 원래 결합할 수 있는 두 문자 사이에 다른 결합 마크가 있는 경우에도 결합이 차단될 수 있습니다.

2.2.3 유니코드 정규화 형식

유니코드 정규화 형식은 네 가지가 있습니다. 각 형식은 문자 코드로 이름이 지정됩니다.

  • D(또는 NFD)는 정준 분해를 의미합니다.
  • C(또는 NFC)는 정준 분해 후 결합을 수행하는 결합을 의미합니다.
  • KD(또는 NFKD)는 호환성 분해를 의미합니다. 문자 C가 이미 사용되었으므로 K를 사용합니다.
  • KC(또는 NFKC)는 호환성 분해 후 결합을 수행하는 것을 의미합니다.

유니코드 정규화는 동일한 문자를 나타내는 이러한 시퀀스 및 잠재적인 다른 이스케이프 시퀀스를 세 가지 변형으로 줄입니다. 그러나 유니코드 정규화가 모든 텍스트 차이를 제거하는 것은 아니며, 경우에 따라 유니코드 정규화를 적용하면 특정 문맥에서 구별되거나 의미 있는 의미가 제거될 수 있습니다. 예를 들면 다음과 같습니다.

  • 모든 호환성 문자에 호환성 분해가 있는 것은 아닙니다.
  • 서로 비슷하게 보이거나 유사한 의미를 가진 일부 문자는 실제로 유니코드에서 서로 다른 문자이며 이를 연결하는 정준 분해 또는 호환성 분해가 없습니다. 예를 들어 [U+3002 IDEOGRAPHIC FULL STOP]는 중국어나 일본어와 같은 언어에서 문장 끝의 마침표로 사용됩니다. 그러나 ASCII 마침표 문자 . [U+002E FULL STOP]와 동등한 것으로 간주되지 않습니다.
  • 일부 문자 변형은 유니코드 정규화 형식으로 처리되지 않습니다. 예를 들어 대문자, 제목 대소문자 및 소문자 변형은 텍스트를 비교할 때 별도로 처리해야 하는 서로 다른 텍스트 변형입니다.
  • 호환성 정규화는 의미를 제거합니다. 예를 들어 문자 ½ [U+00BD VULGAR FRACTION ONE HALF]를 포함하는 문자 시퀀스 호환성 정규화 형식 중 하나인 NFKD 또는 NFKC를 사용하여 정규화하면 ASCII 문자 시퀀스 81/2가 됩니다.

2.3 동일하게 보이는 문자와 정규화의 한계

특정 유니코드 정규화 형식을 적용한 문자열을 포함하여 동일하게 보이는 두 문자열이 실제로는 동일한 기본 유니코드 코드 포인트를 사용하지 않을 수 있다는 사실에 많은 사용자가 놀랍니다. 여기에는 더 파괴적인 NFKCNFKD 호환성 정규화 형식을 적용한 문자열도 포함됩니다. 문자열, 토큰 또는 식별자가 시각적으로 동일하게 보이더라도 서로 다르게 인코딩될 수 있습니다.

유니코드 정준 정규화 형식은 특정 추상 문자 또는 자소 클러스터에 사용할 수 있는 여러 서로 다른 코드 포인트 시퀀스를 동일한 코드 포인트 시퀀스로 접는 것과 관련됩니다. 그러나 논리적으로 서로 다른 문자 또는 자소 클러스터도 여전히 동일하거나 매우 유사하게 보일 수 있습니다. 한 쌍의 자소가 동일하거나 매우 유사하게 보이는 경우 이를 동형 문자라고 합니다. 한 쌍의 자소가 비슷하게 보이거나 동형 문자이지만 실제로 논리적으로 서로 다른 문자나 문자 시퀀스를 나타내는 경우 이를 혼동 가능하다고 합니다.

동일하거나 동일하게 보이는 외관의 예는 하나의 문자 체계 내에서도 나타날 수 있습니다. 이는 "0"과 "O" 또는 "l"과 "1"처럼 모양이 비슷한 문자의 형태를 취할 수 있습니다. 그러나 다른 문자나 서로 다른 호환성 문자를 사용하면 구별하기 훨씬 어려운 변형이 나타날 수 있습니다. 어떤 경우에는 유니코드 정규화가 이를 하나로 만들지만, 다른 많은 경우에는 그렇지 않습니다.

외관이 동일하거나 혼동 가능한 문자는 스푸핑 및 기타 보안 위험을 초래할 수 있습니다. 이는 하나의 문자 체계 내에서 또는 서로 다른 문자 체계의 유사한 문자 사이에서 발생할 수 있습니다. 동형 글리프 및 혼동 가능성에 대한 추가 설명과 예시는 [UTS39]를 참조하는 것이 유용합니다.

동일하거나 비슷하게 보이는 문자 외에도 반대의 문제도 존재합니다. 유니코드 정규화는 NFKCNFKD 호환성 형식을 포함하더라도 본질적인 의미나 기능은 동일하지만 외관 또는 사용 방식이 다른 문자를 하나로 만들지 않습니다. 예를 들어 U+002E(.)와 U+3002(。)는 모두 문장을 끝내는 구두점으로 기능하지만 문자가 별개의 식별성을 가지므로 정규화로 이러한 구분이 제거되지 않습니다.

2.4 정규화와 대소문자 접기의 상호 작용

대소문자를 구분하지 않는 방식으로 문자열을 일치시키는 경우 발생하는 한 가지 복잡성은 원래 문자열이 정규화되어 있더라도 대소문자 접기 과정에서 정규화되지 않은 문자열이 생성될 수 있다는 것입니다. 문자열 비교는 코드 포인트 시퀀스의 일치에 의존하므로 일치 과정의 신뢰성을 보장하려면 대소문자가 접힌 각 문자열을 정규화해야 합니다.

유니코드 정준 정규화 형식(NFC 또는 NFD)과 대소문자 접기를 함께 사용하면 닫혀 있습니다. 즉, 문자열의 대소문자를 접은 다음 NFD 또는 NFC를 적용한 후 동일한 대소문자 접기나 유니코드 정규화 형식을 추가로 적용해도 다른 문자열이 생성되지 않습니다.

문자 사이의 호환성 동등성, 즉 NFKC/NFKD 형식으로 문자열을 비교하는 경우 대소문자 접기와 정규화 연산을 두 번 수행해야 합니다. 호환성 분해 단계에서 대소문자 접기가 필요한 문자가 생성될 수 있고, 이후의 대소문자 접기에서 다시 정규화해야 하는 시퀀스가 생성될 수 있기 때문입니다.

2.4.1 정규화가 대소문자 접기보다 앞서는 이유는 무엇인가?

유니코드의 정준 대소문자 접기 일치 정의(규칙 [D145])와 호환성 대소문자 접기 일치 정의(규칙 [D146])에는 여러 정규화 단계가 포함됩니다. 이로 인해 대소문자를 구분하지 않는 일치의 복잡성과 비용이 증가합니다. 대소문자 접기를 수행하기 전의 초기 정규화 단계는 이 절에서 자세히 설명하는 특정 예외적 사례를 처리합니다.

유니코드의 대소문자 접기 일치 과정에서 마지막 정규화 단계는 결과 문자열이 특정 유니코드 정규화 형식이 되도록 하기 위해 존재합니다. 대소문자가 접힌 결과 문자열을 저장하거나 사용자에게 표시하려면 대소문자 접기 연산으로 생성된 비정규화 시퀀스를 표시 전에 다시 정규화하는 것이 좋은 방법입니다. 그러나 추가 정규화를 수행해도 문자열 비교 결과가 달라지지 않으므로 이 단계는 유니코드 정준 대소문자 접기 정규화 단계유니코드 호환성 대소문자 접기 정규화 단계에서 선택 사항입니다.

63개의 미리 결합된 그리스 문자는 NFD 형식으로 정규화되는 분해 매핑을 가지며, 이 매핑에는 문자    ͅ [U+0345 COMBINING GREEK YPOGEGRAMMENI]가 포함됩니다. 이 문자는 아래 첨자 이오타를 나타내는 발음 구별 부호이며 prosgegrammei 또는 ypogegrammeni라고도 합니다. 이 마크는 고대 또는 고전 그리스어에서 사용되었지만 현대 언어에는 존재하지 않는 소리를 나타내는 정서법적 형식입니다. 이러한 문자의 대문자 및 제목 대소문자 매핑은 이 결합 마크를 별도의 기본 문자 iota로 분리합니다. 제목 대소문자 및 대문자 매핑과의 일관성을 위해 이러한 문자의 대소문자 접기 매핑에는 ι [U+03B9 GREEK SMALL LETTER IOTA]가 포함됩니다. 유니코드 대소문자 접기는 일반적으로 소문자로 변환된다는 점을 기억하십시오.

이 63개 문자 중 하나 뒤에 결합 마크가 오는 경우에만 대소문자 접기 전에 정준 분해를 적용하지 않으면 잠재적인 비교 불일치가 발생할 수 있습니다. 이러한 문자 시퀀스는 정규화 형식이 아니며 키보드 및 기타 입력 절차를 통해 "자연스럽게" 생성하기 어렵습니다.

예를 들어 가장 일반적인 기본 문자와 발음 구별 부호의 표현인 미리 결합된 (NFC) 문자 [U+1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI]에서 시작해 대소문자 접기 변환만 수행하면 다음 결과를 얻습니다. ἄι [U+1F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA + U+03B9 GREEK SMALL LETTER IOTA].

대신 동일한 문자를 나타내는 완전히 분해된 NFD 시퀀스 ᾌ [U+0391 GREEK CAPITAL LETTER ALPHA + U+0313 COMBINING COMMA ABOVE + U+0301 COMBINING ACUTE ACCENT + U+0345 COMBINING GREEK YPOGEGRAMMENI]에서 시작하면 ἄι [U+03B1 GREEK SMALL LETTER ALPHA + U+0313 COMBINING COMMA ABOVE + U+0301 COMBINING ACUTE ACCENT + U+03B9 GREEK SMALL LETTER IOTA]를 얻게 됩니다. 이 문자열을 NFC로 정규화하면 위의 첫 번째 예시와 동일한 문자 시퀀스가 생성됩니다.

두 경우 모두 양음 악센트는 뒤쪽의 이오타가 아니라 알파 기본 문자와 연결됩니다.

그러나 반쯤 미리 결합된 시퀀스 ᾌ [U+1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + U+0301 COMBINING ACUTE ACCENT]에서 시작하면 ἀί [U+1F00 GREEK SMALL LETTER ALPHA WITH PSILI + U+03B9 GREEK SMALL LETTER IOTA + U+0301 COMBINING ACUTE ACCENT]를 얻게 되며, 이 경우 양음 악센트가 이오타와 연결됩니다. 이로 인해 다른 시퀀스와 일치하도록 정규화할 수 없는 시퀀스가 생성되며, 실제로 원래 사용자가 인식한 문자와 의미가 다르므로 올바르지 않습니다.

위에서 언급한 것처럼 유니코드는 대소문자 접기 연산을 수행하기 전에 텍스트를 NFD로 정규화하여 이 일치 문제를 해결합니다. 그러면 [U+1F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI]ᾌ [U+1F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI + U+0301 COMBINING ACUTE ACCENT]는 모두 분해된 버전인 ᾌ [U+0391 GREEK CAPITAL LETTER ALPHA + U+0313 COMBINING COMMA ABOVE + U+0301 COMBINING ACUTE ACCENT + U+0345 COMBINING GREEK YPOGEGRAMMENI]와 동일해집니다. 이제 해당 시퀀스의 대소문자를 접고 정규화하면 모든 경우에 일치하는 결과가 생성됩니다.

2.5 문자 이스케이프 및 포함

대부분의 문서 형식이나 프로토콜은 입력, 처리 또는 인코딩하기 어려운 문자를 포함할 수 있도록 이스케이프 메커니즘을 제공합니다. 이러한 이스케이프 메커니즘은 주어진 리소스 내부에서 문자를 나타내는 추가적인 동등한 방법을 제공합니다. 또한 문서에서 사용하는 문자 인코딩 체계로 표현할 수 없는 유니코드 문자를 인코딩할 수도 있습니다.

참고

명세에서 이스케이프 메커니즘을 정의하기 위한 지침을 포함하여 문자 이스케이프에 관한 자세한 설명은 [CHARMOD]의 4.6절을 참조하십시오.

참고

문자 이스케이프 및 포함의 확장은 문맥, 즉 문자열 일치 연산을 수행할 때 적용되는 것으로 간주되는 구문 콘텐츠 또는 프로그래밍 언어에 따라 달라집니다. suçon은 포함하지 않고 su&#xE7;on을 포함하는 XML 문서에서 문자열 suçon을 검색하는 경우를 살펴보십시오. 일반 텍스트 편집기에서 검색하는 경우 문맥은 일반 텍스트이며 구문 콘텐츠 또는 프로그래밍 언어가 적용되지 않습니다. 따라서 &#xE7; 문자 이스케이프를 인식하거나 확장하지 않으며 검색은 실패합니다. XML 브라우저에서 검색하는 경우 문맥은 XML이고 XML에서 정의한 문자 이스케이프가 확장되므로 검색에 성공합니다.

중간 사례로 엔티티 참조를 확장하지 않은 상태로 XML 문서를 보여 주는 보기를 의도적으로 제공하는 XML 편집기가 있을 수 있습니다. 이 경우 해당 유사 XML 보기에서의 검색은 의도적으로 엔티티를 확장하지 않습니다. 이 특정 문맥에서는 엔티티 참조가 포함으로 간주되지 않으므로 확장할 필요가 없습니다.

예를 들어 U+20AC EURO SIGN은 HTML에서 16진수 엔티티 &#x20ac; 또는 10진수 엔티티 &#8364;로 인코딩할 수도 있습니다. JavaScript 또는 JSON 파일에서는 \u20ac 또는 \u{20AC}로 나타날 수 있고, CSS 스타일시트에서는 \20ac로 나타날 수 있습니다. 이러한 표현은 모두 동일한 리터럴 문자 값인 를 인코딩합니다.

문자 이스케이프는 일반적으로 문서를 처리하고 형식 또는 프로토콜 내의 문자열을 일치시키기 전에 해석됩니다. 위에서 사용한 예로 돌아가 보겠습니다.

이 텍스트는 다음과 같이 표시될 것으로 예상할 수 있습니다. Hello world!

이 기능이 작동하려면 사용자 에이전트(브라우저)가 CSS와 HTML에서 서로 다른 이스케이프 메커니즘을 사용했더라도 클래스 이름 héllo를 나타내는 두 문자열을 일치시켜야 합니다. 위 조각은 텍스트가 달라질 수 있지만 명세에 따라 여전히 "동일한" 것으로 간주될 수 있는 한 가지 방법을 보여 줍니다. 클래스 이름 h\e9llo는 HTML 마크업의 클래스 이름 h&#xe9;llo와 일치하며, 코드 포인트 é [U+00E9 LATIN SMALL LETTER E WITH ACUTE]를 사용하는 리터럴 값 héllo와도 일치합니다.

형식 언어와 문서 형식은 한 리소스의 텍스트 조각을 다른 리소스 내부에 포함하는 기능을 제공하는 경우가 많습니다. 포함리소스의 본문에 콘텐츠를 삽입하는 메커니즘입니다. 포함 메커니즘은 처리 시점에 콘텐츠를 리소스로 가져옵니다. 이는 문서의 구조 및 잠재적으로 문서의 어휘와의 일치에 영향을 줍니다. 포함의 예에는 XML의 엔티티 참조, XInclude [XInclude] 명세 및 CSS의 @import 규칙이 있습니다.

포함된 리소스가 결합 마크로 시작하지 않는 경우, 즉 문자 이스케이프나 문자 리터럴 형태의 결합 마크로 시작하지 않는 경우 해당 포함을 포함 정규화됨이라고 합니다.

2.6 보이지 않는 유니코드 문자

유니코드는 문서 작성자가 텍스트의 외관이나 동작을 제어하는 데 도움을 주는 여러 특수 목적 문자를 제공합니다. 이러한 문자 중 다수는 보이지 않거나 키보드에 대응하는 키가 없으므로 사용자가 해당 문자의 존재 여부를 항상 인식하는 것은 아닙니다. 그 결과 이러한 문자가 인코딩된 문자 시퀀스의 일부이지만 일치가 예상되는 텍스트에는 포함되지 않은 경우 문자열 일치를 방해할 수 있습니다. 이러한 문자의 예는 다음과 같습니다.

유니코드 제어 문자 U+200D Zero Width Joiner( ZWJ라고도 함) 및 U+200C Zero Width Non-Joiner( ZWNJ라고도 함). 이러한 문자는 합자 형성을 제어하여 원하지 않는 합자의 형성을 방지하거나 원하는 합자의 형성을 유도하는 데 사용할 수 있지만, 주된 용도는 아랍 문자 또는 여러 인도계 문자와 같은 복합 문자에서 연결 및 형태 선택을 제어하는 것입니다. 일부 인도계 문자는 ZWJ와 ZWNJ를 사용하여 작성자가 특정 결합 문자의 형태를 제어할 수 있도록 합니다. [Unicode]의 12장에 있는 설명을 참조하십시오.

Zero Width Non-Joiner는 페르시아어에서 특정 "일반적인" 아랍 문자 연결을 방지하는 데 사용됩니다. 이러한 경우 문자의 존재 여부는 실제로 의미에 영향을 줍니다. 예를 들어 단어 تنها("혼자")와 단어 تن‌ها ("신체들" 또는 "시신들")는 각각 "U+062A U+0646 U+0647 U+0627" 및 "U+062A U+0646 U+200C U+0647 U+0627"로 인코딩되며, 유일한 차이는 두 번째 단어에 ZWNJ가 있다는 것입니다.

ZWJ 문자는 특정 이모지 시퀀스를 형성할 때도 사용되며 이에 대해서는 아래에서 자세히 설명합니다.

변형 선택자(U+FE00부터 U+FE0F까지)는 대체 외관 또는 글리프를 선택하는 데 사용하는 문자입니다. 문자 모델: 기본 원칙 [CHARMOD]을 참조하십시오. 예를 들어 흑백 이모지와 컬러 이모지 사이를 선택하는 데 사용됩니다. 이러한 문자는 미리 정의된 표의 문자 변형 시퀀스(IVS)에도 사용됩니다. 유니코드 문자 데이터베이스(UCD)의 "표준화된 변형" 부분에는 많은 예가 제공되어 있습니다.

일부 문자도 시각적 변형 선택을 인코딩하는 방법을 제공합니다. 대표적인 예로 몽골 문자의 자유 변형 선택자(U+180B부터 U+180D까지)가 있습니다.

이름과 달리 자소를 연결하지 않는 U+034F Combining Grapheme Joiner 문자는 정렬 목적으로 자소로 간주될 수 있는 문자를 분리하거나 텍스트에 유니코드 정규화를 적용할 때 특정 텍스트 구분을 유지하는 수단을 제공하는 데 사용됩니다.

공백 변형도 텍스트의 해석과 일치에 영향을 줄 수 있습니다. 예를 들어 NBSP, NNBSP 등 여러 줄바꿈 방지 공백 문자가 있습니다.

U+200B Zero Width Space는 그 밖에는 공백이 나타나지 않는 텍스트에서 단어 경계를 나타내는 데 사용하는 문자입니다. 예를 들어 태국어 문서에서 단어 분리를 지원하는 데 사용할 수 있습니다.

U+00AD Soft Hyphen은 텍스트에서 잠재적인 또는 선호하는 하이픈 연결 위치를 나타내는 데 사용할 수 있습니다. 해당 위치에서 텍스트가 줄바꿈되도록 재배치된 경우에만 표시됩니다.

U+2060 WORD JOINERWJ라고도 하며, 폭이 0인 줄바꿈 방지 공백 문자입니다. 이 문자의 목적은 두 문자 사이의 줄바꿈을 방지하는 것입니다. 줄바꿈 목적을 제외하면 무시해야 합니다. 이 문자는 U+FEFF ZERO WIDTH NO-BREAK SPACE를 대체합니다. U+FEFF는 더 일반적으로 "바이트 순서 표시"(BOM)로 알려져 있기 때문입니다. 바이트 순서 표시는 일부 일반 텍스트 파일의 시작 부분에서 해당 파일이 유니코드 문자 인코딩을 사용한다는 것을 나타내는 데 사용됩니다.

마지막으로 대부분의 문자는 가로로 작성할 때 왼쪽에서 오른쪽으로 진행합니다. 그러나 아랍 문자와 히브리 문자와 같은 일부 문자는 주로 오른쪽에서 왼쪽으로 작성됩니다. 텍스트에는 이러한 문자가 혼합될 수 있으며, 숫자나 다른 문자의 인용문처럼 텍스트의 다른 부분과 반대 방향으로 진행하는 문자 시퀀스가 포함될 수 있습니다. 이러한 텍스트 방향의 혼합을 양방향 텍스트 또는 줄여서 bidi라고 합니다. 유니코드 양방향 알고리즘 [UAX9]은 이러한 혼합 방향 텍스트가 표시를 위해 처리되는 방법을 설명합니다. 대부분의 텍스트에서는 텍스트 자체에서 방향 처리를 도출할 수 있습니다. 그러나 알고리즘이 텍스트를 올바르게 표시하기 위해 추가 정보가 필요한 경우가 많습니다. 더 많은 예시는 [html-bidi]를 참조하십시오.

유니코드에서 텍스트 방향의 모호성을 해결하기 위해 정의한 방법 중 하나는 방향 실행의 시작과 끝을 표시하는 보이지 않는 제어 문자 집합입니다. 양방향 제어 문자는 유니코드 양방향 알고리즘이 텍스트를 표시하는 데 도움을 주므로 텍스트의 외관에 영향을 줄 수 있지만, 제어 문자가 없더라도 텍스트가 자연스럽게 양방향 실행으로 나뉘는 경우에는 텍스트에 영향을 주지 않을 수 있습니다. 이러한 제어 문자는 위에서 언급한 문자와 마찬가지로 보이지 않으므로 일치에 의도하지 않은 영향을 줄 수 있습니다.

이러한 거의 모든 경우에 사용자는 특정 문서나 텍스트 문자열에 이러한 문자가 포함되거나 생략되었는지 인식하지 못하거나 확신할 수 없습니다. 텍스트 일치는 기본 코드 포인트의 일치에 의존하므로 이러한 표시자로 인한 텍스트 인코딩의 변형은 사용자의 관점에서 성공해야 하는 일치가 설명할 수 없이 실패하도록 만들 수 있습니다.

2.7 이모지 시퀀스

유니코드의 비교적 새로운 기능에는 이모지 문자가 있습니다. [UTS51]에서 유니코드는 이를 다음과 같이 설명합니다.

이모지는 일반적으로 다채로운 만화 형식으로 표시되며 텍스트 안에 인라인으로 사용되는 그림 문자입니다. 얼굴, 날씨, 차량과 건물, 음식과 음료, 동물과 식물 또는 감정, 느낌이나 활동을 나타내는 아이콘 등을 표현합니다.

이모지는 U+200D ZERO WIDTH JOINER 또는 ZWJ를 포함한 여러 이모지 수정자와 함께 사용하여 더 복잡한 이모지를 형성할 수 있습니다.

예를 들어 이모지 👪 [U+1F46A FAMILY]는 시퀀스 U+1F468 U+200D U+1F469 U+200D U+1F466에서 이모지 문자 사이에 ZWJ를 사용하여 형성할 수도 있습니다. 다른 이모지 문자를 변경하거나 추가하면 가족의 구성이 달라질 수 있습니다. 예를 들어 시퀀스 👨‍👩‍👧‍👧 U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F467는 이러한 유형의 결합을 지원하는 시스템에서 "가족: 남자, 여자, 여자아이, 여자아이"를 나타내는 결합 이모지 문자를 생성합니다. 여러 일반적인 이모지는 ZWJ 시퀀스를 사용해야만 형성할 수 있습니다. 자세한 내용은 [UTS51]을 참조하십시오.

이모지 문자 뒤에는 이모지 수정자 문자가 올 수 있습니다. 이러한 수정자를 사용하면 사람을 나타내는 이모지의 피부색을 선택할 수 있습니다. 이러한 문자는 일반적으로 수정하는 기본 이모지 뒤에 오는 보이지 않는 수정자입니다. 예를 들면 다음과 같습니다. 👨 👨🏻 👨🏼 👨🏽 👨🏾 👨🏿

이모지 문자 뒤에 변형 선택자를 추가하여 기본 이모지를 텍스트 형식으로 표시하거나 (U+FE0E Variation Selector 15로 표시되는 흑백) 컬러 형식으로 표시하도록 (U+FE0F Variation Selector 16으로 표시) 지정할 수도 있습니다.

이모지 사용에서 또 다른 복잡한 요소는 국기입니다. 국가의 국기는 [BCP47] 레지스트리에서 파생된 국가 코드를 사용하여 구성할 수 있습니다. 예를 들어 시퀀스 🇿 [U+1F1FF REGIONAL INDICATOR SYMBOL LETTER Z] 🇲 [U+1F1F2 REGIONAL INDICATOR SYMBOL LETTER M]은 잠비아의 국가 코드(ZM)이며 🇿🇲를 생성합니다. 다른 지역 또는 특수 목적의 국기는 여러 기호와 함께 국기 이모지를 사용하거나 취소 태그로 끝나는 지역 표시 코드를 사용하여 구성할 수 있습니다. 예를 들어 스코틀랜드 국기(🏴󠁧󠁢󠁳󠁣󠁴󠁿)는 다음과 같이 구성할 수 있습니다.

이러한 각 메커니즘은 함께 사용할 수 있으므로 상당히 복잡한 문자 시퀀스로 하나의 이모지 자소 또는 이미지를 형성할 수 있습니다. 매우 유사한 이모지 시퀀스도 정확히 동일한 인코딩 시퀀스를 사용하지 않을 수 있습니다. 대부분의 경우 위에서 언급한 수정자와 조합은 최종 사용자의 키보드에서 생성되며 키보드에서는 하나의 이모지 "문자"로 표시됩니다. 서로 다른 공급업체가 유니코드에서 "교환에 권장되는" 시퀀스만 정확히 사용한다면 이러한 다양한 인코딩 선택지로 인한 문제가 어느 정도 완화됩니다. 이를 통해 공급업체는 글꼴과 키보드가 사용자가 예상하는 선택지를 제공하도록 준비할 수 있습니다. 그러나 사용자는 일반적으로 기본 인코딩의 복잡성을 인식하지 못하며, 생성 메커니즘은 권장되는 시퀀스로 제한되지 않습니다. 이모지 시퀀스는 빠르게 발전하고 있으므로 가까운 미래에 이모지 일치를 지원하거나 방해하는 추가적인 변화가 발생할 수 있습니다. 유니코드 정규화는 이러한 시퀀스의 순서를 바꾸거나 수정자를 삽입 또는 제거하지 않습니다. 따라서 사용자와 구현자는 사용자가 이름 공간 및 기타 일치 문맥에서 이모지 문자를 사용할 때 인코딩 변형으로 인해 예상하지 못한 "문자" 불일치를 쉽게 겪을 수 있다는 점에 주의해야 합니다.

2.8 레거시 문자 인코딩

리소스레거시 문자 인코딩을 포함한 서로 다른 문자 인코딩 체계를 사용하여 웹에서 문서 형식을 직렬화할 수 있습니다. 각 문자 인코딩 체계는 범용 문자 집합의 특정 하위 집합을 나타내기 위해 서로 다른 바이트 값과 시퀀스를 사용합니다.

참고

모든 문서, 형식 및 프로토콜에 UTF-8과 같은 유니코드 문자 인코딩을 선택하는 것이 강력히 권장됩니다. 레거시 문자 인코딩을 사용해도 추가적인 이점이 없으며, 이를 사용하지 않으면 이 절의 나머지 부분에서 설명하는 고려 사항을 완전히 피할 수 있기 때문입니다.

예를 들어 [U+20AC EURO SIGN]UTF-8 문자 인코딩에서 바이트 시퀀스 0xE2.82.AC로 인코딩됩니다. 동일한 문자는 레거시 문자 인코딩 windows-1252에서 바이트 시퀀스 0x80으로 인코딩됩니다. 다른 레거시 문자 인코딩에서는 이 문자를 인코딩할 수 있는 바이트 시퀀스를 제공하지 않을 수 있습니다.

명세에서는 주로 문서의 문자 인코딩이 레거시 문자 인코딩인지 UTF-8과 같은 유니코드 인코딩인지에 관계없이 해당 인코딩에서 변환한 후 각 문서를 유니코드 문자 시퀀스로 간주하고, 문서를 처리하기 전에 문자 이스케이프를 해제함으로써 이러한 변형을 처리합니다.

참고

하나의 레거시 문자 인코딩 내에서도 구현에 차이가 있을 수 있습니다. 잘 알려진 예로 일본어 레거시 인코딩 Shift_JIS가 있습니다. 서로 다른 트랜스코더 구현은 특정 바이트 시퀀스를 유니코드에 매핑하는 방법을 선택해야 했습니다. 따라서 일부 구현은 바이트 시퀀스 0x80.60(JIS X 0208 문자 집합에서는 0x2141)을 U+301C WAVE DASH에 매핑했지만 다른 구현은 U+FF5E FULL WIDTH TILDE를 선택했습니다. 이는 합리적이고 내부적으로 일관된 두 트랜스코더가 동일한 입력에서 서로 다른 유니코드 문자 시퀀스를 생성할 수 있다는 의미입니다. 인코딩 [Encoding] 명세는 웹 구현이 상호 운용 가능하고 동일한 매핑을 사용하도록 하기 위해 만들어졌습니다. 그러나 인코딩 명세를 준수하는 트랜스코더가 웹에 있는 문서에 적용되거나 특정 문서 형식 또는 프로토콜에 나타나는 데이터를 처리하는 데 사용된다는 보장은 없습니다.

유니코드로 변환할 때 추가로 고려할 사항 중 하나는 시각적 저장 순서를 사용하는 히브리어와 아랍어 같은 양방향 문자의 레거시 문자 인코딩이 존재한다는 것입니다. 즉, 유니코드 및 다른 최신 인코딩과 달리 문자는 라인 프린터와 마찬가지로 화면에 왼쪽에서 오른쪽으로 인쇄되는 순서로 메모리에 저장됩니다. 이러한 인코딩을 유니코드로 변환하거나 해당 인코딩의 텍스트를 비교할 때는 원본 텍스트와 대상 텍스트 모두를 논리적 순서로 배치하도록 주의해야 합니다. 자세한 내용은 [CHARMOD]의 3.3.1절을 참조하십시오.

2.9 기타 동등성 유형

참고

자연어 검색 또는 "찾기" 기능을 수행할 때 적합한 추가적인 동등성 또는 처리 유형이 있습니다. 이러한 유형은 문자 모델 문서 시리즈의 다른 부분 ([STRING-SEARCH])에 설명되어 있습니다. 어휘에 대한 명세 또는 형식 구문에서 사용할 일치 알고리즘을 정의하는 명세는 일관되고 예측 가능한 결과를 생성하는 데 방해가 되므로 해당 문서에 설명된 추가적인 사용자 정의 접기, 매핑 또는 처리를 적용하려고 해서는 안 됩니다.

3. 문서 형식 및 프로토콜에서 구문 콘텐츠의 문자열 일치

문자열이 서로 다른 문자 인코딩을 사용하거나, 해당 인코딩 내에서 서로 다른 문자 시퀀스를 사용하거나, 이 문서에서 설명하는 대소문자와 같은 다른 변형을 가질 수 있는 웹 환경에서는 문자열 동일성을 평가하기 위한 일관된 절차를 확립하는 것이 중요합니다.

이 장에서는 구문 콘텐츠에서 문자열 일치를 지정하고 구현하기 위한 요구 사항을 정의합니다.

3.1 콘텐츠 제한 지정

문자열 일치를 더 효과적이고 일관되게 만드는 방법 중 하나는 일치시킬 콘텐츠에 제한을 적용하는 것입니다. 어휘, 특히 해당 어휘 내에서 사용자 제공 값을 허용하는 어휘의 정의에는 필연적으로 "유효한 식별자"를 구성하는 규칙이 포함됩니다. 여기에는 일반적으로 길이 및 콘텐츠 제한이 포함됩니다. 이러한 제한을 정의하기 위한 몇 가지 모범 사례는 다음과 같습니다.

§

명세는 식별자에서 서로게이트 코드 포인트 (U+D800부터 U+DFFF까지) 또는 비문자 코드 포인트를 허용하지 않아야 합니다.

§

명세는 식별자에서 C0 (U+0000부터 U+001F까지) 및 C1(U+0080부터 U+009F까지) 제어 문자를 허용하지 않아야 합니다.

식별자는 크게 사용자 대상 식별자애플리케이션 내부 식별자의 두 종류로 나뉩니다.

애플리케이션 내부 식별자는 기계가 읽을 수 있고 표시를 목적으로 하지 않는 문서 형식 또는 프로토콜의 어휘 부분입니다. 문서 형식이나 프로토콜의 콘텐츠를 다루거나 디버깅해야 하는 개발자 또는 콘텐츠 작성자에게 편의를 제공하기 위해 이러한 식별자에는 의미 있는 이름, 일반적으로 영어 이름이 지정되는 경우가 많습니다.

§

애플리케이션 내부 식별자, 즉 사용자에게 표시되지 않고 항상 애플리케이션이나 프로토콜 내부에서 일치 또는 처리에 사용되는 식별자를 정의하는 명세는 콘텐츠를 인쇄 가능한 ASCII 하위 집합으로 제한해야 합니다. ASCII 대소문자를 구분하지 않는 일치권장됩니다.

§

애플리케이션 내부 식별자 필드 또는 값은 최종 사용자에게 표시할 때 현지화 가능한 표시 값으로 감싸야 합니다.

사용자 대상 식별자는 사용자가 할당하거나 편집하거나 선택할 수 있도록 사용자에게 제시되는 문서 형식 또는 프로토콜의 어휘 부분입니다. 사용자 대상 식별자의 예로는 SSID와 같은 네트워크 이름, 기기 이름, 클래스, 스타일 또는 속성 이름, 사용자가 정의한 설정 또는 값이 있습니다. 이러한 식별자는 이 문서에서 설명하는 문제로 인해 일치시키기가 더 복잡하지만, 특히 영어를 사용하지 않거나 라틴 문자에 익숙하지 않은 사용자에게 가장 좋은 경험을 제공합니다.

많은 사용자 대상 식별자사용자 제공 값이기도 하며 문서 형식이나 프로토콜의 사용자가 할당할 수 있습니다. 사용자가 선호하거나 사용자의 공동체 또는 문화에서 선호하는 자연어를 사용할 수 있게 하면 더 나은 사용자 경험을 제공하고, 특히 영어 능력이 제한적인 사용자가 기능에 더 쉽게 접근할 수 있습니다.

§

식별자가 사용자에게 표시되거나 잠재적으로 표시될 수 있는 경우, 모든 언어의 사용자가 결과 문서 형식 또는 프로토콜에 동등하게 접근할 수 있도록 명세는 ASCII가 아닌 유니코드 문자의 사용을 허용해야 합니다. 대소문자 구분, 즉 대소문자 접기를 하지 않는 방식이 권장됩니다.

광범위한 유니코드 문자를 허용해야 하지만 명세는 여전히 사용자 대상 식별자의 콘텐츠에 특정한 실용적 제한을 적용할 수 있습니다. 이러한 유형의 콘텐츠 규칙을 정의하는 명세의 예는 유니코드 식별자 및 패턴 구문 [UAX31]에서 확인할 수 있습니다.

3.2 일치 알고리즘 선택

특정 명세에 사용할 일치 알고리즘을 선택할 때의 기본 결정은 일치시킬 문자열에 적용할 텍스트 정규화 수준입니다. 여기에는 대소문자 구분과 유니코드 정규화가 모두 포함됩니다. 역사적으로 웹의 대부분 명세는 유니코드 정규화를 적용하지 않는 대소문자 구분 일치를 선택해 왔으며, 이는 모든 새로운 명세에 권장되는 일치 형식입니다. 그러나 대소문자를 구분하지 않는 방식과 정규화가 유용한 경우도 있습니다.

해당 형식 또는 프로토콜의 사용자에게 제공되는 이점이 구현 비용과 복잡성을 능가하는 경우 명세는 대소문자를 구분하지 않도록 선택할 수 있습니다. 대소문자 접기와 정규화는 모두 비교되는 값에 영향을 줄 수 있고, 텍스트의 표시 및 경우에 따라 의미에도 영향을 주며, 이러한 연산에는 비교적 많은 비용이 들기 때문에 대소문자를 구분하지 않는 방식을 선택하는 것은 일반적으로 권장되지 않습니다.

대소문자를 구분하지 않는 특수한 사례로 ASCII/기본 라틴 문자 범위, 즉 코드 포인트 U+0000부터 U+007F까지로 제한된 어휘가 있습니다. 이러한 명세는 해당 문자 범위에서만 대소문자를 구분하지 않도록 선택할 수 있습니다. 이는 일치 구현을 크게 단순화합니다. 그러나 이 일치 형식은 식별자 또는 구문에서 더 넓은 유니코드 범위를 허용하는 명세에는 적합하지 않습니다. 사용자가 일치 동작을 이해하기 어렵고 ASCII가 아닌 문자와 언어를 사용하는 사용자에게 불리하기 때문입니다. 즉, 사용자는 greenGREEN과 일치하지만 grüßGRÜẞ 또는 GRÜSS와는 일치하지 않고 대신 GRüß과 일치하는 경우 이를 이상하고 예측할 수 없는 동작으로 받아들입니다.

3.2.1 일치 알고리즘

일치 알고리즘은 두 문자열을 비교하는 데 필요한 일련의 단계를 설명합니다.

  1. 비교할 문자열을 유니코드 코드 포인트 시퀀스로 변환합니다. 여기에는 레거시 문자 인코딩으로부터의 트랜스코딩이 포함될 수 있습니다.
  2. 모든 문자 이스케이프 및 포함을 확장합니다.
  3. 적절한 정규화 단계를 수행합니다.
  4. 명세에 특정한 추가 일치 맞춤화를 수행합니다.
  5. 결과 코드 포인트 시퀀스가 동일한지 비교합니다.

3.2.2 적절한 정규화 단계 수행

참고

특정 명세에 적합한 텍스트 정규화는 형식 또는 프로토콜 어휘의 요구 사항에 따라 달라집니다. 텍스트 정규화에는 다음 네 가지 선택지가 있습니다.

  1. 기본. 이 정규화 단계는 텍스트에 영향을 주지 않으므로 대소문자 및 유니코드 정규화와 관련된 형식 차이를 모두 구분합니다.
  2. ASCII 대소문자 접기. ASCII, 즉 기본 라틴 문자 U+0000부터 U+007F까지의 범위에서 문자의 대소문자를 접은 텍스트를 비교합니다.
  3. 유니코드 정준 대소문자 접기. 대소문자를 접고 유니코드 정준 정규화를 적용한 텍스트를 비교합니다.
  4. 유니코드 호환성 대소문자 접기. 대소문자를 접고 유니코드 호환성 정규화를 적용한 텍스트를 비교합니다.
3.2.2.1 기본 정규화 단계
§

식별자와 구문 콘텐츠의 문자열을 일치시킬 때 콘텐츠에 대소문자 접기 또는 유니코드 정규화를 전혀 적용하지 않는 것이 권장됩니다.

이 정규화 단계는 텍스트에 영향을 주지 않으므로 비교되는 원본 문자열의 대소문자 차이와 유니코드 정규화 형식 차이를 모두 구분합니다. 토큰이 일치하기를 기대하는 경우 콘텐츠 작성자는 영향을 받는 텍스트를 인코딩할 때 일관된 대소문자와 일관된 문자 시퀀스를 사용해야 한다는 점을 인식하고 이를 보장해야 합니다.

3.2.2.2 ASCII 대소문자 접기 정규화 단계
§

'ASCII 대소문자 접기' 방식은 어휘 자체가 ASCII 범위로 제한되거나 ASCII 토큰에 대해서만 일치가 수행되는 예외적인 경우에만 사용해야 합니다.

ASCII 대소문자 접기 정규화 단계는 ASCII 범위에서만 대소문자 접기를 수행합니다. 유니코드 정규화 형식은 적용하지 않습니다. 이 단계는 어휘 자체가 ASCII 범위로 제한되거나 ASCII 토큰에 대해서만 일치가 수행되는 경우에만 적합합니다.

각 문자열에 대해 다음 단계를 수행합니다.

  1. 문자열의 각 유니코드 코드 포인트에 대해 코드 포인트가 U+0041 LATIN CAPITAL LETTER A부터 U+005A LATIN CAPITAL LETTER Z까지의 범위에 포함되는 경우, 이를 U+0061 LATIN LOWERCASE LETTER A부터 U+007A LATIN LOWERCASE LETTER Z까지의 범위에 있는 해당 코드 포인트로 대체합니다. 그렇지 않으면 원래 코드 포인트를 유지합니다.
  2. 결과 문자열을 반환합니다.
3.2.2.3 유니코드 정준 대소문자 접기 정규화 단계
§

대소문자를 구분하지 않는 방식은 대부분의 명세에 권장되지 않지만, 어휘가 ASCII가 아닌 문자를 허용하고 대소문자 차이를 구분하지 않으려는 예외적인 경우에는 '유니코드 정준 대소문자 접기' 방식을 사용해야 합니다.

ASCII가 아닌 문자를 허용하는 어휘를 가진 명세에는 대부분의 새로운 어휘가 포함되어야 합니다.

유니코드 대소문자 접기는 비정규화된 문자 시퀀스를 생성할 수 있으므로 일치 결과가 사용자의 예상과 일관되도록 하려면 모든 유니코드 대소문자 접기 뒤에 유니코드 정규화를 수행해야 합니다. 예시는 2.4 정규화와 대소문자 접기의 상호 작용을 참조하십시오.

참고

[Unicode] 요구 사항 D145는 결과 문자열이 정규화 형식이 되도록 대소문자 접기 연산 뒤에 정규화 단계를 수행할 것을 요구합니다. 대소문자 접기 후 정규화를 포함하는 것은 선택 사항입니다. 결과 문자열을 비교에만 사용하고 저장하거나 사용자에게 표시하지 않는 경우 대소문자 접기 후 코드 포인트 시퀀스는 동등합니다. 다만 특정한 정규화 형식이 된다는 보장은 없습니다. 이는 D145에 대한 의도적인 위반입니다. 유니코드는 이것이 유효한 권고임을 확인했습니다.

각 문자열에 대해 다음 단계를 수행합니다.

  1. 문자열에 유니코드 정규화를 수행하여 NFD 형식 또는 NFC 형식으로 변환합니다.
  2. 결과 문자열에 유니코드 전체 대소문자 접기를 수행합니다.
  3. [선택 사항입니다] 결과 문자열에 유니코드 정규화를 수행하여 NFC 형식으로 변환합니다. 이를 통해 사용자에게 표시할 문자열이 정규화 형식이 되도록 합니다.
  4. 결과를 반환합니다.
3.2.2.4 유니코드 호환성 대소문자 접기 정규화 단계
§

'유니코드 호환성 대소문자 접기' 방식은 사용하지 않아야 합니다.

ASCII가 아닌 문자를 허용하고 유니코드 호환성 동등 항목을 일치시켜야 하는 어휘를 가진 명세에서는 이 정규화 단계를 사용할 수 있습니다. 호환성 정규화 형식인 NFKCNFKD는 텍스트의 의미, 외관 및 처리를 변경하므로 이 단계는 웹의 대부분 애플리케이션에서 사용하지 않아야 합니다.

경고

대소문자 접기는 입력 코드 포인트 시퀀스의 영향을 받습니다. 또한 비정규화된 코드 포인트 시퀀스를 생성할 수도 있습니다. 호환성 분해와 대소문자 접기의 상호 작용으로 인해 일관된 일치를 생성하려면 여러 번의 처리가 필요합니다. 따라서 이 정규화 단계에는 유니코드 정규화를 여러 번 사용하는 과정이 포함됩니다. 예시는 2.4 정규화와 대소문자 접기의 상호 작용을 참조하십시오.

각 문자열에 대해 다음 단계를 수행합니다.

  1. 문자열에 유니코드 정규화를 수행하여 NFD 형식으로 변환하거나 영향을 받는 63개의 그리스 문자에 대한 매핑을 수행합니다.
  2. 결과 문자열에 유니코드 전체 대소문자 접기를 수행합니다.
  3. 결과 문자열에 유니코드 정규화를 수행하여 NFKD 형식으로 변환합니다.
  4. 결과 문자열에 유니코드 전체 대소문자 접기를 수행합니다. 이 단계에서는 호환성 매핑으로 생성된 인공적 결과를 제거합니다.
  5. [선택 사항입니다] 결과 문자열에 유니코드 정규화를 수행하여 NFKC 형식으로 변환합니다. 이를 통해 표시할 코드 포인트 시퀀스가 정규화되도록 합니다.
  6. 결과를 반환합니다.

3.2.3 유니코드 코드 포인트 시퀀스로 변환

§

콘텐츠 작성자는 리소스를 유니코드 문자 인코딩으로 입력하고 저장해야 합니다. 웹에서는 일반적으로 UTF-8을 사용합니다.

텍스트 비교의 첫 번째 단계는 두 텍스트가 동일한 디지털 표현을 사용하도록 하는 것입니다. 이는 구현이 레거시 문자 인코딩으로 된 텍스트를 유니코드 코드 포인트 시퀀스로 변환해야 한다는 뜻입니다. 일반적으로 이 작업은 트랜스코더를 적용하여 데이터를 UTF-8 또는 UTF-16과 같은 일관된 유니코드 인코딩 형식으로 변환하는 방식으로 수행합니다. 이를 통해 문자열을 비트 단위로 비교하여 문자열이 같은지 판단할 수 있습니다.

§

특정 문자의 매핑이 의미를 방해하지 않는 한 콘텐츠 작성자는 레거시 인코딩 텍스트 또는 리소스를 유니코드로 변환할 때 정규화 트랜스코더를 선택해야 합니다.

정규화 트랜스코더레거시 문자 인코딩을 유니코드로 변환하는 동시에 결과가 유니코드 정규화 형식 C (NFC)가 되도록 하는 트랜스코더입니다. 대부분의 레거시 문자 인코딩에서는 임의의 트랜스코더 뒤에 정규화기를 사용하여 정규화 트랜스코더를 구성할 수 있습니다. 그러나 레거시 문자 인코딩레퍼토리에 유니코드로 표현되지 않는 문자가 포함된 경우에는 이를 구성할 수 없습니다. 정규화 트랜스코더는 NFC 형식의 문자 시퀀스만 생성하지만 변환된 문자 시퀀스가 포함 정규화됨 상태가 아닐 수 있습니다. 예를 들어 결합 마크로 시작할 수 있습니다.

웹의 문서 형식은 외부 리소스와 상호 작용하거나 이를 사용하여 처리되는 경우가 많으므로, 예를 들어 CSS 스타일시트를 HTML 문서에 적용하는 경우처럼 서로 다른 문자 인코딩을 사용하는 문서 사이에서 값을 일치시킬 때 텍스트를 일관되게 표현하는 것이 중요합니다. 정규화 트랜스코더를 사용하면 레거시 인코딩 문서가 대부분의 언어에서 일반적으로 예상되는 유니코드 문자 시퀀스와 일치하도록 하여 상호 운용성을 보장하는 데 도움이 됩니다.

웹에서 사용하는 대부분의 트랜스코더는 NFC를 출력하지만 일부는 그렇지 않습니다. 이는 일반적으로 트랜스코더가 원본 레거시 문자 인코딩과 왕복 호환되도록 하거나, 다른 문자 구분을 보존하거나, 사용자 에이전트에서 사용하는 다른 트랜스코더와 일관성을 유지하기 위한 것입니다. 이는 인코딩 명세 [Encoding]와 여러 중요한 트랜스코딩 구현에 정규화하지 않는 트랜스코더가 다수 포함된다는 뜻입니다. 실제로 유니코드의 대부분 호환성 문자는 레거시 인코딩에서 왕복 변환하기 위해서만 존재하며, 이들 중 일부는 NFC에서 단일 항목 정준 매핑을 가집니다. 이 문서 앞부분의 예시에서 [U+212B ANGSTROM SIGN]을 통해 이를 확인했습니다.

대부분의 트랜스코더가 NFC 출력을 생성하며, 모든 문자에 대해 NFC를 생성하지 않는 트랜스코더도 대다수 문자에 대해서는 NFC를 생성한다는 점을 기억하십시오. 특히 미리 결합된 형식이 존재하는데도 분해된 형식을 생성하거나 정규화된 시퀀스와 다른 결합 문자 시퀀스를 생성하는 일반적인 트랜스코더는 없습니다. 이는 [Encoding]의 모든 트랜스코더에 적용됩니다.

§

명세는 유니코드 문자 인코딩을 허용해야 합니다.

§

명세는 기본 문자 인코딩을 지정해야 하며, UTF-8을 기본 인코딩으로 지정해야 합니다.

§

명세는 UTF-8 이외의 인코딩을 허용하지 않아야 합니다.

레거시 문자 인코딩은 웹에서 일반적으로 유용성을 상실했습니다. 새로운 명세는 처음부터 유니코드 인코딩을 지원하고, 일반적으로 UTF-8인 유니코드 인코딩을 기본값으로 사용하며, 가능한 경우 다른 인코딩의 사용을 허용하지 않아야 합니다. 이는 상호 운용성을 향상할 뿐만 아니라 문자 및 데이터 표현에서 의미 없는 변형의 범위를 줄입니다.

3.2.4 문자 이스케이프 및 포함 확장

대부분의 문서 형식과 프로토콜은 문자를 이스케이프 시퀀스로 인코딩하거나 텍스트를 포함한 외부 데이터를 리소스에 포함하는 방법을 제공합니다. 이에 대해서는 [CHARMOD]의 4.6절과 위 내용에서 자세히 설명합니다.

일치를 수행할 때는 일치가 적절하게 성공하거나 실패하도록 문자 이스케이프를 언제 해석해야 하는지 아는 것이 중요합니다. 일반적으로 이스케이프, 참조 및 포함은 일치 또는 일치에 민감한 처리를 수행하기 전에 처리하거나 확장합니다. 이러한 구문은 인코딩하기 어려운 시퀀스를 문서에 편리하게 넣을 수 있도록 하는 동시에 해당 문자가 문서에 코드 포인트 시퀀스로 직접 인코딩된 것처럼 동작하도록 하기 위해 존재하기 때문입니다.

복잡할 수 있는 한 가지 영역은 구문 콘텐츠현지화 가능한 콘텐츠가 상호 작용하는 방식을 결정하는 것입니다. 예를 들어 다음 HTML 조각을 살펴보십시오.

기술적으로 결합 마크  ̀ [U+0300 COMBINING GRAVE ACCENT​]는 앞의 따옴표 문자와 결합하지만, HTML은 해당 문자가 엔티티로 인코딩되었는지 여부와 관계없이 HTML 구문의 일부를 구성한다고 간주하지 않습니다.

리소스에 일치 연산을 수행할 때의 일반적인 규칙은 사용자가 상호 작용하는 것과 동일한 "수준"에서 이스케이프를 확장하는 것입니다. 예를 들어 위 예시를 살펴볼 때 HTML의 소스를 보는 도구는 이스케이프 시퀀스 &#x300;을 앰퍼샌드로 시작하는 문자열로 표시합니다. 반면 JavaScript 프로그램은 브라우저가 해석한 문서에서 동작하며 id 속성의 값으로 문자 U+0300을 일치시킵니다.

문서 형식의 구문을 처리할 때는 형식의 처리 규칙에서 명시적으로 금지하지 않는 한 일반적으로 구문 처리 전에 이스케이프를 해당 이스케이프가 나타내는 문자 시퀀스로 변환합니다. 이를 통해 리소스는 모든 유형의 문자를 리소스의 구문 구조에 포함할 수 있습니다.

경우에 따라 이스케이프를 사전 처리하면 문제가 발생합니다. 예를 들어 HTML 문서를 구문 분석하기 전에 시퀀스 &lt;를 확장하면 문서 오류가 발생합니다.

3.2.5 정규화에 대한 추가 고려 사항

특정 유니코드 정규화 형식이 콘텐츠 작성자에게 항상 적합하거나 제공되는 것은 아니며 사용자의 텍스트 인코딩 선택이 이후 데이터 소비자에게 명확하지 않을 수도 있습니다. 이 문서에서 살펴본 것처럼 콘텐츠 작성자나 애플리케이션이 텍스트를 입력하거나 교환할 때 동일한 의미 값을 표현할 수 있는 방법은 다양합니다. 정규화는 사용자가 의도적으로 적용한 구분을 제거할 수 있습니다. 따라서 일치 알고리즘에서는 문자열의 대소문자 접기 일치를 수행할 때만 유니코드 정규화를 사용하도록 지정하며, 이 경우에도 알고리즘 내부에서만 사용합니다. 콘텐츠에 정규화를 강제하면 사용자와 구현자에게 장벽이 될 수 있습니다. 따라서 다음과 같습니다.

§

명세는 특정 어휘의 인코딩, 저장 또는 교환을 위해 유니코드 정규화 형식을 지정하지 않아야 합니다.

§

구현은 콘텐츠를 유니코드 문자 인코딩으로 트랜스코딩하거나 대소문자를 접거나 사용자가 시작한 다른 변경과 같은 텍스트 변환의 부작용으로 필요한 경우를 제외하고, 교환, 읽기, 구문 분석 또는 처리되는 구문 콘텐츠와 사용자 제공 값 또는 현지화 가능한 콘텐츠의 정규화 형식을 변경해서는 안 됩니다. 소비자 또는 콘텐츠 자체가 비정규화된 표현에 의존할 수 있기 때문입니다.

§

작성 도구는 리소스를 정규화할 수 있는 방법을 제공하고 특정 리소스가 유니코드 정규화 형식 C가 아닐 때 사용자에게 경고해야 합니다.

참고

텍스트를 특정 정규화 형식으로 저장하고 교환하도록 요구하는 명세는 3.2.5.1 문서 형식에서 정규화를 지정할 때의 요구 사항을 다뤄야 합니다.

추가 요구 사항이 필요한 구체적이고 명확한 이유가 없는 한, 명세에서 형식이나 프로토콜이 데이터를 정규화 형식으로 저장하거나 교환하도록 요구하는 것은 일반적으로 권장되지 않습니다. 웹의 많은 문서 형식은 정규화를 요구하지 않으므로 콘텐츠 작성자는 경우에 따라 비정규화된 문자 시퀀스에 의존할 수 있습니다. 정규화 단계는 이러한 콘텐츠에 부정적인 영향을 줄 수 있습니다.

정준 정규화 형식인 NFC 또는 NFD 형식은 적용되는 텍스트의 의미와 표현을 보존하기 위한 것입니다. 그러나 항상 그렇지는 않으며, 이것이 정규화를 권장하지 않는 이유 중 하나입니다. NFC는 거의 모든 레거시 데이터가 유니코드 인코딩으로 단순히 일대일 트랜스코딩된 경우뿐 아니라 현재 소프트웨어에서 생성하거나 대부분의 키보드에서 사용자가 입력한 데이터가 이미 이 형식이라는 장점이 있습니다. NFC는 약간 더 간결하며, 대부분의 언어에서 문자와 자소의 관계에 관한 사용자의 예상에도 더 잘 부합합니다.

§

명세는 호환성 정규화 형식인 NFKC와 NFKD를 지정하지 않아야 합니다.

§

구현은 최종 사용자가 명시적으로 요청하지 않는 한 호환성 정규화 형식인 NFKC와 NFKD를 적용해서는 안 됩니다.

호환성 정규화 형식인 NFKC 및 NFKD 형식은 텍스트의 구조를 변경하고 중요한 방식으로 의미를 잃게 합니다. 사용자는 유니코드에서 호환성 매핑을 가진 문자를 의도적으로 사용하기도 하며, 유니코드로 변환할 때 호환성 매핑을 갖는 레거시 문자 인코딩의 문자를 사용하기도 합니다. 이는 콘텐츠 작성자가 의도한 것으로 간주해야 합니다. NFKC와 NFKD가 현지화 가능한 콘텐츠의 "찾기" 연산이나 문자열 검색에서 유용한 경우가 있지만 호환성 차이를 제거하는 것은 해롭습니다.

참고

NFC를 요구하면 명세 개발자가 추가로 주의해야 합니다. 웹 콘텐츠는 일반적으로 알려진 정규화 상태가 아니기 때문입니다. 이러한 경우 비정규화 콘텐츠에 대한 경계 및 오류 조건을 신중하게 고려하고 명확히 지정해야 합니다.

§

정준적으로 동등하지만 서로 다른 유니코드 문자 시퀀스가 보안 문제를 나타내는 경우 명세는 이를 문서화하거나 위험 경고를 제공해야 합니다.

§

콘텐츠 작성자는 가능한 모든 경우 콘텐츠에 유니코드 정규화 형식 C(NFC)를 사용해야 합니다.

일부 언어에서는 NFC가 콘텐츠에 항상 적합하거나 콘텐츠 작성자에게 제공되는 것은 아닙니다.

§

형식 또는 구현에서 수행하는 일치에 유니코드 정규화 형식이 포함된 경우에도 콘텐츠 작성자는 일치를 용이하게 하기 위해 항상 일관된 유니코드 문자 시퀀스를 사용하여 텍스트를 인코딩해야 합니다.

콘텐츠가 일관되게 처리되도록 하려면 콘텐츠 작성자는 동일한 텍스트를 나타낼 때 일관된 코드 포인트 시퀀스를 사용해야 합니다. 콘텐츠는 모든 정규화 형식으로 작성할 수 있으며 비정규화되었지만 유효한 유니코드 문자 시퀀스를 사용할 수도 있지만, 표현이 일관되지 않으면 구현은 서로 다른 시퀀스를 서로 다른 것으로 취급합니다. 일관된 선택, 접근, 추출, 처리 또는 표시를 보장하는 가장 좋은 방법은 항상 NFC를 사용하는 것입니다.

§

콘텐츠 작성자는 리소스에서 앞에 기본 문자가 없는 결합 마크를 포함하지 않아야 합니다.

이에 대한 예외가 있을 수 있습니다. 예를 들어 [Unicode] 문자 목록과 같은 문자 목록을 만드는 경우 작성자는 해당 기본 문자 없이 결합 마크를 사용하고자 할 수 있습니다. 그러나 기본 문자 없이 결합 마크를 사용하면 단순한 구현이 결합 마크를 인접한 구문 콘텐츠, 사용자 제공 콘텐츠 또는 현지화 가능한 콘텐츠와 결합하는 경우처럼 의도하지 않은 표시 또는 처리 문제가 발생할 수 있습니다. 예를 들어  ́ [U+0301 COMBINING ACUTE ACCENT​]와 같은 결합 마크를 HTML의 class 속성 값 시작 부분에 사용하면 클래스 이름이 편집기에 올바르게 표시되지 않고 편집하기 어려울 수 있습니다.

권장되는 기본 문자로는 기본 문자를 표시해야 할 때 사용하는 [U+25CC DOTTED CIRCLE] 또는 기본 문자를 표시하지 않아야 할 때 사용하는   [U+00A0 NO-BREAK SPACE]가 있습니다.

콘텐츠 작성자가 이러한 지침을 항상 따르는 것은 아니므로 다음 요구 사항이 적용됩니다.

§

어휘 명세는 구문 콘텐츠와 문자 데이터 사이의 경계 및 엔티티 경계를 정의해야 합니다. 해당 언어에 포함 메커니즘이 있는 경우 이를 포함합니다. 이러한 경계에는 임의의 문자를 나타내도록 설계된 문자 이스케이프를 허용하면서 해당 언어의 인스턴스를 처리할 때 콘텐츠 처리 또는 일치에 충돌을 일으킬 수 있는 모든 경계가 포함되어야 합니다.

3.2.5.1 문서 형식에서 정규화를 지정할 때의 요구 사항

명세에서 저장, 전송 또는 처리를 위해 유니코드 정규화를 요구하는 경우 해당 명세의 작성자와 구현자는 다음의 추가 고려 사항을 다뤄야 합니다.

§

연산이 정규화된 텍스트 입력에서 비정규화된 출력을 생성할 수 있는 경우, 명세는 결과 출력이 정규화되어야 하는지 여부를 정의해야 합니다. 명세는 일부 연산에서 정규화 수행을 선택 사항으로 명시할 수 있습니다. 이 경우 기본값은 정규화를 수행하는 것이어야 하며, 정규화를 해제하려면 명시적인 옵션을 사용해야 합니다.

§

정규화를 요구하는 명세는 정규화 구현을 선택 사항으로 만들어서는 안 됩니다.

일부 구현은 정규화하고 다른 구현은 정규화하지 않는다면 상호 운용성을 달성할 수 없습니다.

정규화를 수행해야 하는 구현은 다음 요구 사항을 고려해야 합니다.

§

구현이 검사를 통해 텍스트가 정규화 형식임을 확인하거나 텍스트를 직접 다시 정규화하기 전에는 정규화에 민감한 연산을 수행해서는 안 됩니다. 이러한 규칙의 적용을 받지 않는 비공개 시스템 내에서는 비공개 합의를 만들 수 있지만, 외부에서 관찰 가능한 결과는 해당 규칙을 따랐을 때와 동일해야 합니다.

§

텍스트를 수정하고 정규화에 민감한 연산을 수행하는 정규화 텍스트 처리 구성 요소는 각 수정 후 정규화가 수행된 것처럼 동작해야 합니다. 따라서 이후의 정규화에 민감한 연산은 항상 정규화된 텍스트를 다루는 것처럼 동작해야 합니다.

§

작성 도구 구현은 처리, 표시 또는 교환을 방해할 수 있는 결합 마크로 시작하는 구문 콘텐츠의 입력이나 생성을 방지하거나 사용자에게 경고해야 합니다.

3.2.6 대소문자 접기에 대한 추가 고려 사항

문자열 동일성 일치에서 중요한 고려 사항 중 하나는 비교가 대소문자를 구분하는지 여부입니다.

§

형식 또는 구현에서 대소문자 접기 일치를 지원하는 경우에도 콘텐츠 작성자는 일치를 용이하게 하기 위해 식별자를 항상 일관된 대문자, 소문자 및 혼합 대소문자 형식으로 작성해야 합니다.

3.2.6.1 대소문자를 구분하는 일치
§

사용자가 정의한 값을 포함한 구문 콘텐츠를 일치시킬 때 대소문자를 구분하는 일치가 권장됩니다.

어휘는 일반적으로 콘텐츠 작성자와 사용자가 동작을 예측할 수 있는 것을 중요하게 여깁니다. 대소문자를 구분하는 일치는 구현하기 가장 쉽고 일반적으로 기본 유니코드 코드 포인트 시퀀스를 비교하는 것으로 구성되므로 혼동 가능성이 가장 적습니다. 언어별 대소문자 매핑과 같은 고려 사항의 영향을 받지 않으므로 위의 터키어 예시와 같은 단어를 구문 콘텐츠에 포함한 문서 작성자에게 예상하지 못한 결과를 가장 적게 발생시킵니다.

대소문자를 구분하지 않는 방식은 일반적으로 현지화 가능한 콘텐츠를 처리하는 데 사용됩니다. 예를 들어 자연어 텍스트 검색을 수행하는 경우입니다. 그러나 대소문자를 구분하지 않는 방식이 필요한 경우도 있습니다. 이러한 경우 형식 언어는 여러 구현 선택지를 고려해야 합니다.

3.2.6.2 유니코드 대소문자를 구분하지 않는 일치
§

유니코드의 기본 라틴 문자 ASCII 범위를 초과하는 문자를 포함하는 어휘에서 대소문자를 구분하지 않는 일치를 정의하는 명세는 유니코드 전체 대소문자 접기 일치를 지정해야 합니다.

§

명세는 사용자가 정의한 값에 전체 유니코드 범위를 허용해야 합니다.

어휘는 일반적으로 특히 사용자 제공 값에 대해 광범위한 유니코드 문자를 허용해야 합니다. 이를 통해 가능한 한 다양한 언어와 문화에서 불이익 없이 사용할 수 있습니다. 따라서 대소문자 접기와 같은 텍스트 연산은 선택한 일부 범위만이 아니라 유니코드의 전체 범위를 처리해야 합니다. 대소문자를 구분하지 않는 일치가 필요한 경우 이는 유니코드 대소문자 접기를 사용한다는 뜻입니다.

유니코드 단순 대소문자 접기 형식은 웹의 문자열 동일성 일치에 적합하지 않습니다.

3.2.6.3 ASCII 대소문자를 구분하지 않는 일치
§

유니코드의 기본 라틴 문자 ASCII 하위 집합으로 제한된 어휘에서 대소문자를 구분하지 않는 일치를 정의하는 명세는 ASCII 대소문자를 구분하지 않는 일치를 지정할 수 있습니다.

어휘가 ASCII로 제한되고 사용자가 정의한 이름이나 식별자를 허용하지 않는 형식 언어는 ASCII 대소문자를 구분하지 않는 일치를 지정할 수 있습니다. 한 가지 예로 HTML 명세에서 정의한 요소와 속성 이름을 ASCII 대소문자를 구분하지 않고 비교하도록 정의하는 HTML이 있습니다.

모든 토큰과 식별자를 명세에서 직접 정의하고 해당 식별자 또는 토큰이 유니코드의 기본 라틴 문자 하위 집합만 사용하는 경우에만 어휘를 "ASCII 전용"으로 간주합니다. 사용자가 정의한 식별자를 허용하는 경우에는 보안 또는 교환 문제에 따라 적절히 제한된 전체 유니코드 문자 범위를 허용하고 문자열 동일성 일치에 유니코드 대소문자를 구분하지 않는 방식을 사용해야 합니다. [UTR36]을 참조하십시오.

참고

ASCII 전용 어휘는 식별자 또는 값에 더 넓은 유니코드 범위를 허용하는 문서 형식이나 프로토콜 내부에 존재할 수 있습니다. 예를 들어 [CSS-SYNTAX-3]은 식별자와 값에 전체 유니코드 범위를 사용할 수 있도록 CSS 스타일시트 형식을 정의합니다. 그러나 CSS 명세는 항상 ASCII 범위의 하위 집합을 사용하여 CSS 키워드를 정의합니다. 따라서 많은 스타일시트에 ASCII가 아닌 식별자 또는 데이터 값이 포함되어 있더라도 CSS의 어휘는 ASCII 전용입니다.

3.2.6.4 언어별 맞춤화

로케일 또는 언어별 맞춤화는 자연어 처리 연산의 일부일 때 가장 적합하며 이는 이 문서의 범위를 벗어납니다. 대소문자 매핑 또는 대소문자 접기의 언어별 맞춤화는 일반적인 대소문자 접기 규칙과 다른 결과를 생성하므로 예측 가능성이 중요한 형식 언어에서는 이를 피해야 합니다.

§

어휘에서 대소문자를 구분하지 않는 일치를 정의하는 명세는 언어에 민감한 대소문자를 구분하지 않는 일치를 지정하지 않아야 합니다.

§

언어에 민감한 대소문자 구분 일치를 지정하는 경우 유니코드 대소문자 매핑은 언어에 따라 맞춤화해야 하며, 각 맞춤화에 사용되는 언어의 출처를 지정해야 합니다.

일치시키는 두 문자열은 서로 다른 언어일 수 있으며 또 다른 제3의 언어 문맥에 나타날 수도 있습니다. 따라서 대소문자 접기에 사용할 언어는 애플리케이션과 사용자의 예상에 따라 달라집니다.

언어 정보는 얻거나 검증하거나 관리하기 어려울 수 있으며, 결과 연산이 사용자를 불편하게 하거나 사용 중인 언어 설정 또는 일치가 수행되는 시스템의 설정에 따라 일부 사용자에게는 실패하고 다른 사용자에게는 성공할 수 있으므로 형식 언어에 언어별 맞춤화를 사용하는 것은 권장되지 않습니다.

§

언어별 연산에는 적절한 경우 언어별 대소문자 접기가 포함되어야 합니다.

예를 들어 CSS 연산 text-transform은 문자열을 대소문자 매핑하는 데 사용할 때 언어에 민감합니다.

참고

유니코드 대소문자 접기가 문서 형식과 프로토콜에서 선호되는 대소문자를 구분하지 않는 일치 방식이지만, 기본값과 다른 매핑을 가진 언어의 콘텐츠 작성자와 사용자는 여전히 결과에 놀랄 수 있습니다. 이들의 예상은 일반적으로 자신이 사용하는 언어와 일치하기 때문입니다.

참고

대부분의 프로그래밍 언어와 운영 환경은 각각의 로케일 기반 API를 사용하여 언어별 맞춤화에 접근하므로 언어에 민감한 문자열 비교를 흔히 로케일에 민감한 비교라고 합니다. 예를 들어 Java 프로그래밍 언어의 java.text.Collator 클래스 또는 JavaScript의 Intl.Collator를 참조하십시오.

3.2.7 추가 일치 맞춤화

§

명세는 일치 과정의 일부로 수행하는 모든 추가 맞춤화를 명확히 정의해야 합니다.

일부 명세는 특정 어휘에서 일치를 지원하기 위해 추가 맞춤화를 포함하고자 할 수 있습니다. 예로는 2절에서 설명한 추가 텍스트 차이를 제거하거나, 구문의 일부인 문자를 함께 매핑하거나 제거하거나, 공백을 잘라내는 작업이 있습니다.

모든 추가 맞춤화는 서로 다른 언어가 유니코드로 표현되는 방식을 방해하지 않아야 합니다. 예를 들어 텍스트를 분해한 다음 모든 결합 문자를 제거하여 문자에서 악센트를 제거하려는 과정은 결합 마크에 의존하는 언어를 손상시킵니다. 한 가지 예는 예시 2의 데바나가리 텍스트입니다. 이러한 과정은 잠재적인 모든 악센트를 제거하지 못하며 텍스트의 의미와 표현도 손상시킬 가능성이 높습니다.

4. 기타 일치 및 처리 고려 사항

형식 언어에서 문자열과 토큰을 일치시키는 것이 이 문서의 주요 관심사이지만, 때로는 명세가 순수한 문자열 동일성을 넘어서는 추가적인 일치 유형을 고려해야 합니다.

4.1 정규 표현식

§

정규 표현식 구문을 정의하는 명세는 [UTS18]에 따라 최소한 기본 유니코드 수준 1 지원을 제공해야 하며, 확장 또는 맞춤화된 수준 2와 수준 3 지원을 제공해야 합니다.

정규 표현식 구문은 사용자가 일부만 알려져 있거나 예측 가능한 방식으로 달라질 수 있는 값을 지정할 수 있게 하므로 형식이나 프로토콜을 정의할 때 유용할 수 있습니다. 이 문서의 여러 절에서 살펴본 것처럼 문자를 유니코드로 인코딩할 수 있는 방식에는 변형이 있으며, 이는 표현식에서 문자열을 지정하거나 일치시키는 방식을 방해할 수 있습니다. 예를 들어 문자 수를 셀 때는 사용되는 유니코드 코드 포인트 수가 아니라 자소 경계에 의존해야 할 수 있습니다. 대소문자를 구분하지 않는 일치는 대소문자 접기 변형을 고려해야 할 수 있으며, 처리되는 표현식 또는 텍스트의 유니코드 정규화를 고려해야 할 수도 있습니다.

유니코드 정규 표현식 수준 1 지원에는 이스케이프를 사용하는 방식을 포함하여 정규 표현식에서 유니코드 코드 포인트를 지정하는 기능과 유니코드 문자 속성 및 대부분의 정규 표현식 구문에 공통적인 특정 유형의 경계에 접근하는 기능이 포함됩니다.

수준 2는 이를 여러 중요한 기능으로 확장합니다. 특히 특정 유형의 자소 클러스터 경계에서 텍스트를 선택하는 기능과 대소문자 변환 지원이 포함됩니다. 이 두 주제는 위에서 자세히 설명했습니다. 수준 3은 로케일 [LTLI]을 기반으로 정규 표현식을 맞춤화하는 기능을 제공합니다. 이는 형식 언어에서는 유용성이 낮지만 현지화 가능한 콘텐츠를 처리할 때 유용할 수 있습니다.

A. 마지막 게시 버전 이후의 변경 사항

이 문서의 변경 사항은 2018-04-20의 작업 초안부터 GitHub 커밋 로그에서 확인할 수 있습니다.

이 버전에서는 유니코드 정준 대소문자 접기 정규화 단계유니코드 호환성 대소문자 접기 정규화 단계에서 선택 사항인 정규화 단계를 변경합니다. 이 버전은 첫 번째 단계로 정규화를 요구하고 출력 정규화를 선택 사항으로 만듭니다. 이 변경은 테스트 및 유니코드와의 논의를 기반으로 합니다.

B. 감사의 말

W3C 국제화 작업 그룹과 관심 그룹을 비롯한 여러 관계자가 많은 의견과 제안을 제공했습니다. 작업 그룹은 다음 분들께 감사드립니다. Mati Allouche, Ebrahim Byagowi, John Cowan, Martin Dürst, Behdad Esfahbod, Asmus Freitag, Richard Ishida, John Klensin, Peter Saint-Andre, Amir Sarabadani, Najib Tounsi, Richard Wordingham, 그리고 이 문서가 개발된 20년(!!) 동안 참여한 모든 CharMod 기여자.

이 문서의 이전 버전은 다음 편집자들이 편집했습니다.

CSS 스냅샷 2026

C. 참고 문헌

C.1 규범적 참고 문헌

[ASCII]
ISO/IEC 646:1991, 정보 기술 -- 정보 교환을 위한 ISO 7비트 부호화 문자 집합. URL: https://www.ecma-international.org/publications-and-standards/standards/ecma-6/
[BCP47]
언어 식별 태그. A. Phillips, 편집자; M. Davis, 편집자. IETF. 2009년 9월. 현행 모범 사례. URL: https://www.rfc-editor.org/info/rfc5646/
[CHARMOD]
월드 와이드 웹 문자 모델 1.0: 기본 원칙. Martin Dürst; François Yergeau; Richard Ishida; Misha Wolf; Tex Texin 외. W3C. 2005년 2월 15일. W3C 권고안. URL: https://www.w3.org/TR/charmod/
[CHARREQ]
문자열 동일성 일치 및 문자열 색인 요구 사항. Martin Dürst. W3C. 2009년 9월 15일. W3C 작업 그룹 참고 문서. URL: https://www.w3.org/TR/charreq/
[css]
CSS 스냅샷 2026. Tab Atkins Jr.; Elika Etemad; Florian Rivoal; Chris Lilley; Sebastian Zartner. W3C. 2026년 6월 22일. W3C 작업 그룹 참고 문서. URL: https://www.w3.org/TR/css-2026/
[Encoding]
인코딩 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://encoding.spec.whatwg.org/
[HTML]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[html-bidi]
HTML 및 CSS의 양방향 텍스트에 대한 추가 요구 사항. Aharon Lanin; Richard Ishida. W3C. 2015년 7월 21일. W3C 작업 그룹 참고 문서. URL: https://www.w3.org/TR/html-bidi/
[INFRA]
인프라 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[INTERNATIONAL-SPECS]
명세 개발자를 위한 국제화 모범 사례. Richard Ishida; Addison Phillips. W3C. 2025년 8월 8일. W3C 작업 그룹 참고 문서. URL: https://www.w3.org/TR/international-specs/
[ISO10646]
정보 기술 - 범용 다중 옥텟 부호화 문자 집합(UCS) - 제1부: 구조 및 기본 다국어 평면.. 1993. ISO/IEC10646-1:1993.
[LTLI]
월드 와이드 웹을 위한 언어 태그 및 로케일 식별자. Addison Phillips. W3C. 2020년 10월 7일. W3C 작업 초안. URL: https://www.w3.org/TR/ltli/
[RFC2119]
요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 용어. S. Bradner. IETF. 1997년 3월. 현행 모범 사례. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC3986]
URI(Uniform Resource Identifier): 일반 구문. T. Berners-Lee; R. Fielding; L. Masinter. IETF. 2005년 1월. 인터넷 표준. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC8174]
RFC 2119 핵심 용어의 대문자와 소문자 모호성. B. Leiba. IETF. 2017년 5월. 현행 모범 사례. URL: https://www.rfc-editor.org/info/rfc8174/
[UAX11]
동아시아 문자 폭. Ken Lunde 小林剣. 유니코드 컨소시엄. 2025년 7월 24일. 유니코드 표준 부록 #11. URL: https://www.unicode.org/reports/tr11/tr11-44.html
[UAX15]
유니코드 정규화 형식. Ken Whistler. 유니코드 컨소시엄. 2025년 7월 30일. 유니코드 표준 부록 #15. URL: https://www.unicode.org/reports/tr15/tr15-57.html
[UAX29]
유니코드 텍스트 분할. Josh Hadley. 유니코드 컨소시엄. 2025년 8월 17일. 유니코드 표준 부록 #29. URL: https://www.unicode.org/reports/tr29/tr29-47.html
[UAX31]
유니코드 식별자 및 구문. Mark Davis; Robin Leroy. 유니코드 컨소시엄. 2025년 8월 20일. 유니코드 표준 부록 #31. URL: https://www.unicode.org/reports/tr31/tr31-43.html
[UAX35]
유니코드 로케일 데이터 마크업 언어(LDML). Mark Davis 외. 유니코드 컨소시엄. 2020년 10월 23일. 유니코드 기술 표준 #35. URL: https://www.unicode.org/reports/tr35/tr35-61/tr35.html
[UAX50]
유니코드 세로쓰기 텍스트 레이아웃. Ken Lunde 小林剣; Koji Ishii 石井宏治. 유니코드 컨소시엄. 2025년 7월 24일. 유니코드 표준 부록 #50. URL: https://www.unicode.org/reports/tr50/tr50-33.html
[UAX9]
유니코드 양방향 알고리즘. Manish Goregaokar मनीष गोरेगांवकर; Robin Leroy. 유니코드 컨소시엄. 2025년 8월 13일. 유니코드 표준 부록 #9. URL: https://www.unicode.org/reports/tr9/tr9-51.html
[Unicode]
유니코드 표준. 유니코드 컨소시엄. URL: https://www.unicode.org/versions/latest/
[UTR36]
유니코드 보안 고려 사항. Mark Davis; Michel Suignard. 유니코드 컨소시엄. 2014년 9월 19일. 유니코드 기술 보고서 #36. URL: https://www.unicode.org/reports/tr36/tr36-15.html
[UTS18]
유니코드 정규 표현식. Mark Davis. 유니코드 컨소시엄. 2025년 1월 16일. 유니코드 기술 표준 #18. URL: https://www.unicode.org/reports/tr18/tr18-25.html
[UTS39]
유니코드 보안 메커니즘. Mark Davis; Michel Suignard. 유니코드 컨소시엄. 2025년 9월 4일. 유니코드 기술 표준 #39. URL: https://www.unicode.org/reports/tr39/tr39-32.html
[UTS51]
유니코드 이모지. Mark Davis; Ned Holbrook. 유니코드 컨소시엄. 2025년 9월 4일. 유니코드 기술 표준 #51. URL: https://www.unicode.org/reports/tr51/tr51-29.html
[XInclude]
XML 포함(XInclude) 버전 1.0(제2판). Jonathan Marsh; David Orchard; Daniel Veillard. W3C. 2006년 11월 15일. W3C 권고안. URL: https://www.w3.org/TR/xinclude/

C.2 정보 제공용 참고 문헌

[CSS-SYNTAX-3]
CSS 구문 모듈 레벨 3. Tab Atkins Jr.; Simon Sapin. W3C. 2021년 12월 24일. 후보 권고안 초안. URL: https://www.w3.org/TR/css-syntax-3/
[STRING-META]
웹의 문자열: 언어 및 방향 메타데이터. Richard Ishida; Addison Phillips. W3C. 2024년 10월 17일. W3C 작업 그룹 참고 문서. URL: https://www.w3.org/TR/string-meta/
문자열 검색. Addison Phillips. W3C. 2025년 1월 7일. 초안 참고 문서. URL: https://www.w3.org/TR/string-search/
[XML10]
확장 가능한 마크업 언어(XML) 1.0 (제5판). Tim Bray; Jean Paoli; Michael Sperberg-McQueen; Eve Maler; François Yergeau 외. W3C. 2008년 11월 26일. W3C 권고안. URL: https://www.w3.org/TR/xml/