문자, 코드 포인트, 글리프 (glyph) 및 그래 핀 (grapheme)의 차이점은 무엇입니까?


146

현대의 유니 코드의 미묘함을 이해하려고하면 머리가 아파요. 특히, 코드 포인트, 문자, 글리프 및 그래 핀 (그래프) 사이의 구별은 ASCII 문자를 사용하여 영어 텍스트를 처리 할 때 모두 서로 일대일 관계를 갖는 가장 간단한 경우 개념 으로 인해 문제를 일으 킵니다.

Matthias Bynens의 JavaScript가 한 통일 에 관한 유니 코드 문제 또는 Wikipedia의 기사 와 같은 문서 에서이 용어가 어떻게 사용되는지 확인하면서 , 나는 이러한 개념이 같지 않으며 충돌하는 것이 위험하다는 것을 모았습니다. 각 용어의 의미 를 파악하기 위해 고심하고 있습니다.

Unicode Consortium 은이 내용을 설명 하는 용어집 을 제공 하지만 다음과 같은 "정의"로 가득합니다.

추상 문자 . 텍스트 데이터의 구성, 제어 또는 표현에 사용되는 정보 단위. ...

...

캐릭터 . ... (2) 추상 문자의 동의어. (3) 유니 코드 문자 인코딩을위한 기본 인코딩 단위. ...

...

문양 . (1) 하나 이상의 글리프 이미지를 나타내는 추상 형태. (2) 글리프 이미지의 동의어. 유니 코드 문자 데이터를 디스플레이 할 때, 특정 문자를 묘사하기 위해 하나 이상의 글리프가 선택 될 수있다.

...

Grapheme . (1) 특정 작문 체계의 맥락에서 가장 독창적 인 작문 단위. ...

이러한 정의의 대부분은 매우 학문적이고 형식적인 소리의 질을 갖지만 , 의미 의 질이 결여되어 있거나 정의의 문제를 또 다른 용어집 항목이나 표준 섹션으로 연기합니다.

그래서 나는 나보다 더 많이 배운 사람들의 비범 한 지혜를 구합니다.이 개념들 각각이 정확히 어떻게 다른가? 그리고 어떤 상황에서 그들은 서로 일대일 관계를 갖지 않겠습니까?


다양한 언어를위한 매우 다양한 작문 시스템이 있습니다. 따라서 글쓰기 문제에 대한 다른 견해가 있으며 그 뒤에는 오랜 역사가 있습니다. IMHO는 유니 코드가 모든 것을 다루려고하기 때문에 이것을 명심하는 것이 유용합니다 . (한글 또는 다른 문자? 한자 급진? 한글? 분음 부호? 피부색 이모티콘? ...)
Pablo H

답변:


225
  • 문자 는 많은 것을 의미 할 수있는 것보다 과부하 된 용어입니다.

  • 코드 포인트 정보의 기본 단위이다. 텍스트 는 일련의 코드 포인트입니다. 각 코드 포인트는 유니 코드 표준에서 의미하는 숫자입니다.

  • 코드 부 (A)의 기억의 단위 인 부분 부호화 된 코드 포인트. UTF-8에서는 8 비트, UTF-16에서는 16 비트를 의미합니다. 단일 코드 단위는 전체 코드 포인트 또는 코드 포인트의 일부를 나타낼 수 있습니다. 예를 들어, 눈사람 글리프 ( )는 단일 코드 포인트이지만 3 UTF-8 코드 단위와 1 UTF-16 코드 단위입니다.

  • 자모는 독자가 기록 시스템의 한 요소로서 인식하는 단일 그래픽 유닛으로 표시되는 하나 이상의 코드 포인트의 서열이다. 예를 들어, a및 둘 다 ägraphemes이지만 여러 코드 포인트로 구성 ä될 수 있습니다 (예 : 기본 문자에 대한 코드 코드 a하나와 분음 부호에 대한 코드 코드 코드 포인트 두 개가있을 수 있음) . ). 일부 코드 포인트는 그래프의 일부가 아닙니다 (예 : 너비가 0이 아닌 조인 또는 방향 재 지정).

  • 그래프는 일반적으로 저장된 이미지 인 폰트 이들 자모 또는 부분을 나타내는 데 (글리프의 집합이다). 폰트는 복수의 글리프를 단일의 표현으로 구성 할 수 있습니다. 예를 들어, 상기의 ä코드 포인트가 단일의 코드 포인트 인 경우, 폰트는 그것을 2 개의 별개의 공간적으로 중첩 된 글리프로서 렌더링하도록 선택할 수 있습니다. OTF의 경우 글꼴의 GSUB 및 GPOS 테이블에는이 작업을 수행하기위한 대체 및 위치 정보가 포함됩니다. 폰트는 같은 grapheme에 대한 여러 대체 글리프를 포함 할 수 있습니다.


4
방금 코드 포인트와 코드 단위의 순서를 재정렬 한 수정 사항을 제출했습니다. 코드 단위가 두 번째로되어야한다는 데 동의합니다. "제외 (out of place)"에 대해서는이 답변이 저와 다른 목적을 수행한다고 생각합니다. 이 용어들 모두를 한 곳에 모아두면 큰 가치가 있다고 생각합니다. 내가 원하는 마지막 것은 구글에서 "문양, 그래프, 코드 단위 및 코드 포인트의 차이점은 무엇이며 두 곳에서 답을 얻어야합니다. 많은 토론에서이 용어는 모두 토론에 사용됩니다. 코드 단위가 아닌 다른 4
개와

1
예를 들어 '\ uD83D \ uDC0A'(악어 이모티콘 표시)는 코드 포인트, 그래 핀 등이 무엇입니까? 특히, 어떻게 관련이 있는가 .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0).charCodeAt(1)결과를?
qbolec

3
@qbolec : 단일 코드 포인트 (U + 1F40A)를 표현하는 두 개의 UTF-16 코드 단위이며, 그림 이모티콘 인 경우 아마도 자체의 단일 그래프입니다.
Kerrek SB

2
@ TomPažourek : 분해 된 정식화에서는 두 개의 코드 포인트 ( a"결합 분음 부호")로 표시됩니다. 구성된 정규화에서는 단일 코드 포인트 ( ä이전 레거시 Latin-1 범위에서)로 표시됩니다. 유니 코드 정규화는 관심이 있는지 조사하려는 주제입니다. 빈 슬레이트 세계에서는 기본 및 결합 문자 만 있고 사전 빌드 된 합성물은 없습니다.
Kerrek SB

1
@ Kaushik : 나는 당신이 무엇을 의미하는지 잘 모르겠습니다 : 코드 단위는 저장 단위이지만, 일반적으로 코드 포인트는 저장을 위해 여러 코드 단위를 필요로합니다 (UTF-32 제외).
Kerrek SB

1

유니 코드 표준 이외의 문자 는 하나 이상의 그래프 로 구성된 개별 텍스트 단위입니다 . 유니 코드 표준이 "문자"로 정의하는 것은 실제로 그래프와 문자가 혼합 된 것입니다. 유니 코드는 병렬 그래프를 개별 문자로 해석하는 규칙을 제공합니다.

유니 코드 코드 포인트는 각각에 할당 된 고유 번호이다 유니 코드 문자 (문자 나 자모 하나 인).

불행하게도, 유니 코드 규칙은 일부 병렬 그래프를 이미 자체 코드 포인트가있는 다른 그래프로 해석 할 수 있도록 허용합니다 ( 사전 작성된 형식 ). 즉, 유니 코드에는 문자를 나타내는 여러 가지 방법이 있습니다. 유니 코드 정규화는 이 문제를 해결합니다.

글리프는 캐릭터의 시각적 표현입니다. 글꼴은 유니 코드 문자가 아닌 특정 문자 세트에 대한 글리프 세트를 제공합니다. 모든 캐릭터에 대해 가능한 많은 글리프가 있습니다.

Mark Amery에게 답장

먼저 언급했듯이 각 문자에 대해 가능한 많은 글리프가 있으므로 문자가 "항상 단일 글리프로 표시되지 않습니다". 유니 코드는 글리프와 크게 관련이 없으며 코드 차트에서 정의하는 것은 글리프가 아닙니다. 문제는 모두 문자가 아니라는 것입니다. 그래서 그들은 무엇입니까?

더 큰 엔티티, 그래프 또는 문자는 무엇입니까? 문자 나 문장 부호가 아닌 텍스트의 그래픽 요소를 무엇이라고 부릅니까? 빠르게 떠오르는 용어는 "그래프"입니다. "텍스트의 그래픽 단위"라는 개념을 정확하게 구체화하는 단어입니다. 나는이 정의를 제공한다 : grapheme은 서면 텍스트에서 가장 작은 별개의 구성 요소이다 .

다른 방법으로 가서 graphemes가 문자로 구성되어 있다고 말하면 "Chinese graphemes"로 불리고, 중국 graphemes로 구성되는 모든 비트와 조각은 "characters"로 불리어야합니다. 그러나 그것은 모두 거꾸로입니다. 그래 핀은 별개의 작은 조각과 조각입니다. 캐릭터가 더 발달합니다. "문자는 컴포지션 가능"이라는 구절은 유니 코드와 관련하여 "문자는 컴포지션 가능"으로 더 잘 표현됩니다.

유니 코드는 문자를 정의하지만 다른 grapheme 또는 문자로 구성 될 grapheme도 정의합니다. 당신이 작곡 한 괴물은 이것의 좋은 예입니다. 그들이 붙잡는다면 나중 버전의 유니 코드에서 자신의 코드 포인트를 얻을 수 있습니다.)

이 모든 것에는 재귀적인 요소가 있습니다. 더 높은 수준에서 그래 핀은 문자가 그래 핀이되지만 그래 핀은 끝까지 내려갑니다.

TS에 대한 답변

표준 상태의 1 장 : "유니 코드 문자 인코딩은 알파벳 문자, 표의 문자 및 기호를 동일하게 처리하므로 모든 혼합 및 동일한 기능으로 사용할 수 있습니다". 이 진술이 주어지면, 우리는 표준에서 용어의 혼동에 대비해야합니다. 때로는 표준이 발전함에 따라 적절한 용어가 소급하여 명확 해 지기도합니다.

언어의 공식적인 정의에서 종종 두 가지 기본 사항이 서로 관련하여 정의됩니다. 예를 들어, XML 에서 요소는 시작 태그, 컨텐츠, 종료 태그로 정의됩니다. 콘텐츠는 차례로 요소, 문자 데이터 또는 기타 몇 가지 가능한 것으로 정의됩니다. 자체 참조 정의 패턴은 유니 코드 표준에도 내재되어 있습니다.

grapheme은 코드 포인트 또는 문자입니다.

문자는 하나 이상의 그래 핀 순서로 구성됩니다.

처음에이 두 가지 정의에 직면했을 때 독자는 코드 포인트 문자 라는 근거로 첫 번째 정의에 반대 할 수 있지만 항상 그런 것은 아닙니다. 두 코드 포인트의 시퀀스는 정규화 하에서 단일 코드 포인트를 인코딩하는 경우가 있으며, 해당 인코딩 된 코드 포인트는 그림 2.7 과 같이 문자를 나타냅니다 . 다른 코드 포인트를 인코딩하는 코드 포인트 시퀀스 이것은 조금 까다로워지고 UTF-8 과 같은 문자 인코딩 체계 가 코드 포인트를 바이트 시퀀스로 인코딩하는 데 사용되는 계층에 도달하지 못했습니다 .

예를 들어 분음 부호 에 대한 학술 기사 및 일부 문자의 경우 문자 자체가 텍스트에 나타날 수 있습니다. 이러한 맥락에서 개별 문자 부분은 문자로 간주 될 수 있으므로 유니 코드 표준도 유연하게 유지됩니다.

Mark Avery가 지적했듯이 캐릭터는 더 복잡한 것으로 구성 될 수 있습니다. 즉, 각 문자는 원하는 경우 그래픽으로 사용할 수 있습니다. 모든 구성의 최종 결과는 "사용자가 캐릭터로 생각하는 것"입니다. 표준 또는이 논의에서, 최상위 레벨에서 사용자가 개별 문자로 생각하는 텍스트에 이러한 것들이 있다는 생각에 대한 실제 저항은없는 것 같습니다. 이 용어에 과부하가 걸리지 않도록 문자를 구성하는 데 사용되는 부분을 참조하려는 모든 경우에 "grapheme"을 사용할 수 있습니다.

때때로 유니 코드 표준은 그 용어와 함께 사방에 있습니다. 예를 들어, 3 장 에서는 UTF-8을 "인코딩 형식"으로 정의하고 용어집에서는 "인코딩 형식"을 다른 것으로 정의하고 UTF-8을 "문자 인코딩 체계"로 정의합니다. 또 다른 예는 "Grapheme_Base"및 "Grapheme_Extend"이며, 이는 실수 로 인정 되지만 제거하는 것이 약간의 작업이므로 지속됩니다. 이 표준에서 사용하는 용어를 강화하기 위해 아직해야 할 일이 있습니다.

그래 핀 소목 장이 결합을 추가하기위한 제안은 그것이 밝혔다 잘못 때있어 "제자가 그 대응 사용자가 문자로 어떻게 생각하는지에 대한 하나의 시퀀스 이상의 인코딩 된 문자가 있습니다." 대신에 "하나 이상의 graphemes의 시퀀스는 사용자가 캐릭터로 생각하는 것을 구성합니다." 그런 다음 "문자 시퀀스"라는 용어와 "그래프 시퀀스"라는 용어를 구별하여 사용할 수 있습니다. 두 용어 모두 유용합니다. "그래프 순서"는 작은 조각으로 캐릭터를 만드는 과정을 깔끔하게 의미합니다. "문자 순서"는 일반적으로 "사용자가 문자로 생각하는 일련의 것들"이라는 의미를 의미합니다.

때때로 프로그래머는 그래 핀 시퀀스 수준에서 작동하기를 원하기 때문에 시퀀스를 검사하고 조작하는 메커니즘을 사용할 수 있어야하지만 일반적으로 텍스트를 처리 할 때는 "문자 시퀀스"(사용자가 생각하는 것)에서 작동하는 것으로 충분합니다. 시스템을 하위 레벨 세부 사항을 관리하게하십시오.

이 논의에서 지금까지 다루었던 모든 경우에, "grapheme"을 사용하여 불가분의 구성 요소를, "문자"를 사용하여 작성된 엔티티를 나타내는 것이 더 깨끗합니다. 이 사용법은 두 용어의 오랜 의미를 더 잘 반영합니다.


신중한 -1; 나는 이것이 틀렸다고 생각한다 . 캐릭터는 많은 그래프로 구성 될 수 있지만 항상 단일 글리프 (glyph)로 표현됩니다. 사실 다른 방법이라고 생각합니다. en.wikipedia.org/wiki/N-diaeresis 와 같은 페이지 는 문자를 분음 부호 (적어도 그 의미를 변경하는 문자)와 조합하면 별개의 새로운 그래프를 형성하며, 분음 부호는 그 자체로 그래프가 아니라고 제안합니다. 한편, 그리 명확하게 작성 가능 이후 수있는 일 이랬입니다
마크 Amery

방금 본 답변에 감사드립니다. 그러나 그래도 그래 핀의 정의는 실제로 잘못되었거나 적어도 유니 코드 가 단어를 정의하는 방식과 상충된다고 생각합니다 . 당신은 "모든 뒤로"를 것으로 문자로 구성되는 그래 핀의 아이디어를 기각, 그러나 나는 조금 파고 않았다 발견 unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm 그대로 문으로 시작 " 그래 핀은 하나 이상의 인코딩 된 문자의 시퀀스입니다 " .
Mark Amery 12

그리고 그 진술은 "... 이것은 사용자가 캐릭터로 생각하는 것과 일치합니다." " grapheme-joiner "라는 용어와 용어의 배후 메커니즘 조차도 대답의 시작 부분에 언급 한 내용을 보여줍니다. 유니 코드 표준이 "문자"로 정의한 것은 실제로 그래프와 문자가 혼합 된 것입니다. " precomposed characters "및 " grapheme clusters " 와 같은 뒤틀림을 발명하는 대신 graphemes "graphemes"및 문자 "characters"를 호출하는 것이 더 깨끗합니다 .
가난한 Yorick

@PoorYorick "... 문자는 하나 이상의 graphemes로 구성된 개별 텍스트 단위"및 "Graphemes는 별개의 작은 비트와 조각입니다. 문자가 더 많이 개발되었습니다"라고 주장합니다. 이러한 주장을 뒷받침하는 참조가 있습니까? 내가 어떻게 든 의심하기 때문에, 유니 코드 컨소시엄은 의도적으로 그들의 이름을 "반전 된"것으로 정의하기로 결정했다.
TS

@PoorYorick이 추가 설명을 추가하기 전에 요점을 이해했습니다. 나는 당신이 그것을 해석하는 방식으로 grapheme을 사용하는 문서를 알지 못했기 때문에 단순히 참고 문헌 (어휘, 과학 기사, 기술 표준 등)을 요구했습니다. (그래프에 대한 첫 번째 Google 검색 결과도 단어를 사용하지 않습니다). "그래프는 코드 포인트 또는 문자입니다 [...]"-인용 부호를 추가했습니다. 마지막에 "두 용어의 오랜 의미"를 말합니다. -그것이 확립되면 무언가에 연결됩니다, 그것은 이런 식으로 용어를 사용하고 있습니다.
TS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.