文字、コードポイント、グリフ、書記素の違いは何ですか?


146

現代のUnicodeの繊細さを理解しようとすると、頭が痛くなります。特に、コードポイント、文字、グリフ、および書記素の違い- 最も単純な概念ケースでは、ASCII文字を使用して英語のテキストを処理するときに、すべて互いに1対1の関係問題を引き起こしています。

これらの用語がMatthias BynensのJavaScriptのようなドキュメントでどのように使用されるかを見て、Unicodeの問題またはWikipediaのHanの統一に関する部分に、これらの概念は同じものではなく、それらを混同することは危険だと収集しましたが、私は一種の各用語の意味を理解するのに苦労しています。

Unicodeコンソーシアムは、このことを説明する用語集を提供していますが、次のような「定義」でいっぱいです。

抽象文字。テキストデータの編成、制御、または表現に使用される情報の単位。...

...

キャラクター。...(2)抽象文字の同義語。(3)Unicode文字エンコーディングのエンコーディングの基本単位。...

...

グリフ。(1)1つ以上のグリフ画像を表す抽象的なフォーム。(2)グリフ画像の同義語。Unicode文字データの表示では、特定の文字を表すために1つ以上のグリフを選択できます。

...

書記素。(1)特定の書記体系に照らして、最小の特徴を持つ筆記単位。...

これらの定義のほとんどは、非常に学術的で正式な響きの品質を備えていますが、意味する品質に欠けていますか、定義の問題を標準のさらに別の用語集エントリまたはセクションに委ねています。

それで、私は私よりも多くのことを学んだそれらの難解な知恵を求めます。これらの概念のそれぞれはどの程度正確に互いに異なり、どのような状況でそれらは互いに1対1の関係を持たないでしょうか?


多くの異なる言語のために、多くの非常に異なる書記体系があります。したがって、書き込みの問題についてはさまざまな見方があり、その背後にも長い歴史があります。私見Unicodeはすべてをカバーしようとするので、それを覚えておくことは有用です。(筆記体は同じか異なる文字ですか?漢字部首?ハングル?分音記号?肌色の絵文字?? ...)
Pablo H

回答:


225
  • キャラクターは、多くのことを意味する可能性があるので、過負荷の用語です。

  • コード・ポイント情報の最小単位です。テキストはコードポイントのシーケンスです。各コードポイントは、Unicode規格によって意味が与えられた数値です。

  • コード部の記憶単位である部分の符号化コードポイントの。UTF-8ではこれは8ビットを意味し、UTF-16ではこれは16ビットを意味します。単一のコード単位は、完全なコードポイントまたはコードポイントの一部を表す場合があります。たとえば、雪だるまのグリフ()は単一のコードポイントですが、3つのUTF-8コード単位と1つのUTF-16コード単位です。

  • 書記素は、読者が書き込みシステムの単一の要素として認識する単一のグラフィカルユニットとして表示されている1つ以上のコードポイントのシーケンスです。たとえば、aäは両方とも書記素ですが、複数のコードポイント(たとえばä、2つのコードポイントがあり、1つは基本文字のa後に1つの分音符号が続きますが、この書記素を表す代替のレガシーの単一コードポイントもあります。 )。一部のコードポイントは書記素の一部にはなりません(たとえば、ゼロ幅の非結合子、または方向のオーバーライド)。

  • グリフは、通常に記憶された画像であり、フォントその書記素または部分を表すために使用される(グリフの集合です)。フォントは、複数のグリフを単一の表現に構成する場合があります。たとえば、上記äが単一のコードポイントである場合、フォントは、空間的にオーバーレイされた2つの別々のグリフとしてレンダリングすることを選択できます。OTFの場合、フォントのGSUBおよびGPOSテーブルには、これを機能させるための置換および配置情報が含まれています。フォントには、同じ書記素に対する複数の代替グリフも含まれる場合があります。


4
コードポイントとコードユニットの順序を変更した編集を送信しました。私はコードユニットが2番目に来るべきだとあなたに同意します。「場違い」であることに関して、私はあなたがこの答えが私とは異なる目的を果たしていると思っていると思います。これら5つの用語すべてを1か所にまとめることには大きな価値があると思います。私が望んでいる最後のことは、「グリフ、書記素、コードユニット、コードポイントの違いは何ですか?」というグーグル検索で、2か所で答えを得る必要があります。多くのディスカッションでは、これらの用語はすべてディスカッションで使用され、まれに他の4
つとの

1
たとえば、「\ uD83D \ uDC0A」(ワニの絵文字を表示)の場合、コードポイントや書記素などは何ですか。特に、それはどのようにに関係しない.length.codePointAt(0).codePointAt(1).charCodeAt(0).charCodeAt(1)の結果?
qbolec 2017

3
@qbolec:これらは、単一のコードポイント(U + 1F40A)を表す2つのUTF-16コードユニットであり、絵文字であることを考えると、おそらく独自の単一の書記素です。
Kerrek SB 2017

2
@TomPažourek:分解された正規化では、2つのコードポイント(aおよび「結合発音区別符号」)で表されます。構成された正規化でäは、(古いレガシーLatin-1範囲の)単一のコードポイントで表されます。Unicodeの正規化は、これに関心がある場合に調査したいテーマです。白紙の世界では、基本キャラクターと結合キャラクターのみが存在し、事前に作成された合成物は存在しません。
Kerrek SB 2017

1
@Kaushik:意味がわかりません:コードユニットはストレージのユニットです、はい、しかし、コードポイントは一般的にストレージに複数のコードユニットを必要とします(UTF-32を除く)。
Kerrek SB

1

Unicode標準の範囲外では、文字は1つ以上の書記で構成されるテキストの個別の単位です。。Unicode標準で「文字」と定義されているのは、実際には書記素と文字の混合です。Unicodeは、並置された書記素を個々の文字として解釈するためのルールを提供します。

Unicodeの コードポイントは、それぞれに割り当てられた固有の番号であるUnicode文字(文字または書記素のいずれかです)。

残念ながら、Unicodeの規則により、並置された一部の書記素は、独自のコードポイント(合成済みの形式)を既に持っている他の書記素として解釈できます。つまり、Unicodeには文字を表現する方法が複数あります。Unicode正規化はこの問題に対処します。

グリフは、文字を視覚的に表現したものです。フォントは、(Unicode文字ではなく)特定の文字セットに一連のグリフを提供します。すべての文字に対して、可能なグリフの数は無限です。

マークアメリーへの返信

まず、先に述べたように、各文字には可能なグリフの数が無限にあるため、文字は「常に単一のグリフで表される」わけではありません。Unicodeはグリフとあまり関係がなく、コードチャートで定義されているものはグリフではありません。問題は、どちらもすべてのキャラクターではないということです。それで、彼らは何ですか?

より大きな実体、書記素または文字はどれですか?文字や句読点ではないテキストのグラフィック要素を何と呼びますか?すぐに思い浮かぶのが「書記素」です。これは、「テキスト内のグラフィカルユニット」の概念を正確に想起させる言葉です。私はこの定義を提供します:書記素は、書面での最小の個別のコンポーネントです

逆に言えば、書記素は文字で構成されていると言うこともできますが、それらは「中国語の書記素」と呼ばれ、中国の書記素を構成するすべてのビットとピースは、代わりに「文字」と呼ばれる必要があります。しかし、それはすべて逆です。書記素は、特徴的な小さな断片です。キャラクターはより発達しています。「グリフは合成可能」という語句は、Unicodeのコンテキストでは「文字は合成可能」としてより適切に記述されます。

Unicodeは文字を定義しますが、他の書記素や文字で構成される書記素も定義します。あなたが作成したそれらの怪物は、この良い例です。もし彼らが多分それに追いついたら、彼らは新しいバージョンのユニコードで独自のコードポイントを得るでしょう;)

これにはすべて再帰的な要素があります。より高いレベルでは、書記素は文字になり、書記素になりますが、書記素はずっと下にあります。

TSへの返信

第1章標準のでは、「Unicode文字エンコーディングは、アルファベット文字、表意文字、および記号を同等に扱います。つまり、これらは任意の組み合わせで、同等の機能で使用できます。」この声明が与えられれば、規格内の用語の融合に備える必要があります。標準が発展するにつれ、適切な用語が振り返ってみると明らかになることがあります。

言語の正式な定義では、2つの基本的なものが相互に定義されていることがよくあります。たとえば、 XMLでは、要素は開始タグとして定義され、その後にコンテンツが続き、その後に終了タグが続きます。コンテンツは、要素、文字データ、または他のいくつかの可能なものとして順に定義されます。自己参照定義のパターンは、Unicode標準でも暗黙的です。

書記素は、コードポイントまたは文字です。

文字は、1つ以上の書記素のシーケンスから構成されます。

最初にこれらの2つの定義に直面したとき、読者はコードポイント文字であるという理由で最初の定義に反対するかもしれません、常にそうであるとは限りません。図2.7に示すように、2つのコードポイントのシーケンスは、正規化の下で1つのコードポイントをエンコードする場合があり 、そのエンコードされたコードポイントは文字を表し ます。他のコードポイントをエンコードするコードポイントのシーケンス。これは少しトリッキーになっており、UTF-8などの文字エンコーディングスキームを使用してコードポイントをバイトシーケンスにエンコードする層にも到達していません。

一部のコンテキストでは、たとえば、発音区別符号に関する学術記事 や、文字の個々の部分が単独でテキストに表示される場合があります。そのコンテキストでは、個々の文字部分は文字と見なすことができるため、Unicode標準も同様に柔軟であることに意味があります。

マーク・エイブリーが指摘したように、キャラクターはより複雑なものに構成することができます。つまり、必要に応じて、各文字を書記素として使用できます。すべての構成の最終結果は、「ユーザーがキャラクターとして考える」ものです。標準でもこのディスカッションでも、最高レベルではユーザーが個々の文字として考えるこれらのものがテキストにあるという考えには、実際の抵抗はないようです。その用語のオーバーロードを回避するために、文字を構成するために使用されるパーツを参照したいすべての場合に「書記素」を使用できます。

時々、ユニコード標準はその用語で至る所にあります。たとえば、第3章で はUTF-8を「エンコーディングフォーム」として定義していますが、用語集では「エンコーディングフォーム」を別のものとして定義し、UTF-8を「文字エンコーディングスキーム」として定義しています。もう1つの例は、「Grapheme_Base」と「Grapheme_Extend」です。これら間違いであることが認められていますが、それらを削除することは少しのタスクなので、それは持続します。規格で採用されている用語を厳しくするために行うべき作業がまだあります。

書体とは、ユーザーが文字と考えるものに対応する1つ以上のエンコードされた文字のシーケンスである」と述べたときに、COMBINING GRAPHEME JOINERの追加に関する提案が間違っていました。代わりに、「1つまたは複数の書記素のシーケンスは、ユーザーが文字として考えるものを構成します」と読む必要があります。次に、「文字シーケンス」という用語とは区別して「書記シーケンス」という用語を使用できます。どちらの用語も役に立ちます。「書記素シーケンス」は、小さな断片からキャラクターを構築するプロセスを適切に意味します。「文字シーケンス」とは、私たち全員が通常、直感的に意味するものを意味します。「ユーザーが文字と考えるもののシーケンス」。

プログラマーが本当に書記素シーケンスのレベルで操作したい場合があるので、それらのシーケンスを検査および操作するメカニズムが利用できるはずですが、通常、テキストを処理するときは、「文字シーケンス」(ユーザーが考えていること)を操作するだけで十分です。キャラクターとして)、システムに下位レベルの詳細を管理させます。

この説明でこれまでに取り上げたすべてのケースで、「grapheme」を使用して分割不可能なコンポーネントを参照し、「character」を使用して合成エンティティを参照する方がわかりやすくなっています。この使用法は、両方の用語の長い間確立された意味をよりよく反映しています。


注意してください-1; 私が考えて、これは間違っています。文字は多くの書記素で構成できることを意味しますが、常に1つのグリフで表されます。実際、それは逆です。en.wikipedia.org/wiki/N-diaeresisのようなページは、文字と発音区別符号(少なくともその意味を変更するもの)の組み合わせが別個の新しい書記素を形成し、発音区別符号自体が書記素ではないことを示唆しています。一方、グリフは明らかに合成可能ですs͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery

見たばかりの返信に感謝します。しかし、私はまだあなたの書記素の定義は実際には正しくないと思います、または少なくともユニコードが単語を定義する方法と対立しています。文字で構成される書記素が「すべて後方」であるという考えを却下しましたが、私は少し掘り下げたところ、文字どおり」で始まるunicode.org/L2/L2000/00274-N2236-grapheme-joiner.htmを見つけました。書記素は、1つ以上のエンコードされた文字のシーケンスです
マークアメリー2018年

そして、そのステートメントは続きます、「それはユーザーが文字として考えるものに対応します」。grapheme-joiner」という用語と、その背後にあるメカニズムは、私の回答の冒頭で述べたことを示しています。Unicode標準で「文字」と定義されているものは、実際には書記素と文字の混合です。「構成済み文字」や「書記素クラスター」などのゆがみを生み出すよりは、書記素を「書記素」や文字を「文字」と呼ぶ方がきれいです。
貧しいヨリック

@PoorYorickあなたは、「...文字は1つ以上の書記素で構成されるテキストの個々の単位である」、「書記素は別個の小さな断片と断片です。文字はより発達している」と主張します。これらの主張を裏付ける参考資料はありますか?私はどういうわけか疑わしいので、Unicodeコンソーシアムは彼らの名前を何らかの形で「逆」に定義することを意図的に決定したと思います。
TS

@PoorYorickこの説明を追加する前に、私はあなたの要点を理解しました。それが私が尋ねた理由ではありません。参考文献(辞書、科学記事、技術標準など)を尋ねただけです。私は、書記素を解釈する方法で使用する文書を知りませんでした。(書記素の最初のいくつかのグーグルの結果もあなたの邪魔をしないでください)。「書記素はコードポイントまたは文字です。[...]」というブロック引用を追加しましたが、どこから来たのですか?最後に、「両方の用語の長い間確立された意味」と言います。-それが確立されている場合、何かにリンクします、それはこのように用語を使用しています。
-TS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.