web-dev-qa-db-ja.com

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

現代のユニコードの繊細さを理解しようとすると、頭が痛くなる。特に、コードポイント、文字、グリフ、および書記素の区別-simplestの場合、ASCII文字を使用して英語のテキストを処理する場合、すべてが互いに1対1の関係-私にトラブルを引き起こしています。

Matthias Bynensのようなドキュメントでこれらの用語がどのように使用されるかを見て JavaScriptにはユニコードの問題がある またはWikipediaの Han統一 の部分は、これらの概念は同じではないことを集めましたそしてそれらを統合することは危険ですが、私は各用語meansを把握するのに苦労しています。

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

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

...

文字。 ...(2)抽象文字の同義語。 (3)Unicode文字エンコードのエンコードの基本単位。 ...

...

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

...

書記素。 (1)特定の書記体系の文脈における最小限の特徴的な書記単位。 ...

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

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

99
Mark Amery
  • 文字は、多くのことを意味するよりも多くの用語です。

  • コードポイントは、情報の原子単位です。 テキストはコードポイントのシーケンスです。各コードポイントは、Unicode標準で意味が与えられている番号です。

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

  • graphemeは、読者が書記体系の単一の要素として認識する単一のグラフィカルな単位として表示される1つ以上のコードポイントのシーケンスです。たとえば、aäは両方とも書記素ですが、それらは複数のコードポイントで構成される場合があります(たとえば、äは2つのコードポイントで、ベース文字a糖尿病の1つが続きますが、この書記素を表す代替のレガシーの単一コードポイントもあります)。一部のコードポイントは、書記素の一部ではありません(たとえば、幅がゼロの非結合、または方向のオーバーライド)。

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

160
Kerrek SB

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

A nicodeコードポイントは、それぞれに割り当てられた一意の番号ですnicode character(which文字または書記素です)。

残念ながら、Unicodeの規則により、並置されたいくつかの書記素は、独自のコードポイント(precomposed forms)を既に持つ他の書記素として解釈されます。つまり、Unicodeには文字を表す方法が複数あります。 nicode正規化 はこの問題に対処します。

グリフは、キャラクターの視覚的表現です。フォントは、特定の文字セット(Unicode文字ではない)のグリフセットを提供します。すべての文字について、可能なグリフの数は無限です。

マークアメリーへの返信

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

偉大な実体、書記素またはキャラクターはどちらですか?文字や句読点ではないテキスト内のグラフィック要素を何と呼びますか?すぐに頭に浮かぶ用語の1つが「書記素」です。 「テキスト内のグラフィカルなユニット」という考えを正確に思い起こさせる言葉です。私はこの定義を提供します:書記素は書かれたテキストの中で最小の明確なコンポーネントです

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

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

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

TSへの返信

第1章 の標準状態:「Unicode文字エンコードは、アルファベット文字、表意文字、および記号を同等に処理します。つまり、これらは任意の組み合わせで同等の機能で使用できます」。この声明を考えると、標準の用語のいくつかの混同に備える必要があります。適切な用語は、標準が開発されたときに、振り返ってみると明らかになる場合があります。

言語の正式な定義では、2つの基本的な事項が相互に定義されていることがよくあります。たとえば、 [〜#〜] xml [〜#〜] では、要素は開始タグとして定義され、場合によってはコンテンツと終了タグが続きます。コンテンツは、要素、文字データ、または他のいくつかの可能なものとして順番に定義されます。 Unicode規格では、自己参照定義のパターンも暗黙的です。

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

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

これらの2つの定義に最初に直面したとき、読者はコードポイントis文字であるという理由で最初の定義に反対するかもしれませんが、それは必ずしも真実ではありません。 2つのコードポイントのシーケンスは、 正規化 で単一のコードポイントをエンコードする場合があり、そのエンコードされたコードポイントは 図2.7 に示すように文字を表します。他のコードポイントをエンコードするコードポイントのシーケンス。これは少し注意が必要であり、コードポイントをバイトシーケンスにエンコードするために TF-8 などの文字エンコード方式が使用されるレイヤーには到達していません。

状況によっては、たとえば diacritics に関する学術記事や、キャラクターの個々の部分がテキスト自体に表示される場合があります。そのコンテキストでは、個々の文字部分は文字と見なすことができるため、Unicode標準も柔軟性を維持していることは理にかなっています。

Mark Averyが指摘したように、キャラクターをより複雑なものに構成することができます。つまり、必要に応じて各文字を書記素として機能させることができます。すべての構成の最終結果は、「ユーザーがキャラクターと考えるもの」です。標準でもこの議論でも、ユーザーが個々のキャラクターと考えるテキストには最高レベルでこれらのものがあるという考えに対して、本当の抵抗はないようです。その用語の過負荷を避けるために、キャラクターを構成するために使用されるパーツを参照したいすべての場合に「書記素」を使用できます。

ユニコード標準は、その用語で随所に見られます。たとえば、 Chapter はUTF-8を「エンコード形式」として定義し、用語集は「エンコード形式」を他の何かとして定義し、UTF-8を「文字エンコード方式」として定義します。もう1つの例は「Grapheme_Base」と「Grapheme_Extend」です。これらは 確認済み 間違いであるが、それらを削除するのはちょっとしたタスクなので、持続します。標準で採用されている用語を厳しくするために、まだやるべきことがあります。

COMPINGING GRAPHEME JOINERの追加提案 は、「グラフィムは、ユーザーが文字と考えるものに対応する1つ以上のエンコードされた文字のシーケンス」と述べたときに間違っていました。代わりに、「1つ以上の書記素のシーケンスが、ユーザーがキャラクターと考えるものを構成する」と読む必要があります。次に、「文字列」という用語とは区別して「書記素シーケンス」という用語を使用できます。両方の用語が役立ちます。 「書記素シーケンス」は、小さなピースからキャラクターを構築するプロセスをきちんと暗示しています。 「文字シーケンス」とは、通常、ユーザーが「ユーザーが文字と考える一連のこと」を意味するものとして一般に直観するものを意味します。

時々プログラマーは書記素シーケンスのレベルで操作したいので、それらのシーケンスを検査および操作するメカニズムが利用可能であるべきですが、一般に、テキストを処理するとき、「文字シーケンス」(ユーザーが考えるものキャラクターとして)、下位レベルの詳細をシステムに管理させます。

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

0
Poor Yorick