UTF-8が8ビットの場合、最大256文字の異なる文字しか存在できないという意味ではありませんか?
最初の128コードポイントはASCIIの場合と同じです。しかし、UTF-8は最大100万文字をサポートできると言っていますか?
これはどのように作動しますか?
UTF-8は常に1バイトを使用するわけではなく、1〜4バイトです。
最初の128文字(US-ASCII)には1バイトが必要です。
次の1,920文字をエンコードするには2バイトが必要です。これは、ほぼすべてのラテンアルファベットの残り、ギリシャ語、キリル文字、コプト語、アルメニア語、ヘブライ語、アラビア語、シリア語、ターナのアルファベット、および発音区別符号の組み合わせを対象としています。
基本的な多言語面の残りの文字には3バイトが必要です。これには、ほとんどの中国語、日本語、韓国語[CJK]文字を含む、一般的に使用される実質的にすべての文字[12]が含まれます。
Unicodeの他のプレーンの文字には4バイトが必要です。これには、あまり一般的ではないCJK文字、さまざまな歴史的なスクリプト、数学記号、絵文字(絵文字記号)が含まれます。
ソース: Wikipedia
UTF-8は1文字あたり1〜4バイトを使用します。ASCII文字用に1バイト(最初の128個のUnicode値はasciiと同じです)。ただし、必要なのは7ビットだけです。最上位(「符号」)ビットが設定されている場合、これはマルチバイトシーケンスの開始を示します。連続する上位ビットセットの数はバイト数を示し、その後0になり、残りのビットが値に寄与します。他のバイトの場合、最上位の2ビットは1と0で、残りの6ビットは値用です。
したがって、4バイトシーケンスは11110 ...(および... =値の場合は3ビット)で始まり、それぞれの値が6ビットの3バイトの場合、21ビットの値になります。 2 ^ 21はUnicode文字の数を超えているため、すべてのUnicodeはUTF8で表現できます。
Unicodeはコードポイントを文字に解決します。 UTF-8はUnicodeのストレージメカニズムです。 Unicodeには仕様があります。 UTF-8には仕様があります。両方とも異なる制限があります。 UTF-8には異なる上向きがあります。
Unicodeは "planes。" で指定され、各プレーンは216 コードポイント。 Unicodeには17のプレーンがあります。合計17 * 2^16
コードポイント。 最初のプレーン、プレーン0またはBMP は、運ぶものの重みが特別です。
すべてのニュアンスを説明するのではなく、飛行機に関する上記の記事を引用してください。
17プレーンは1,114,112コードポイントを収容できます。これらのうち、2,048は代理であり、66は非文字であり、137,468は私的使用のために予約されており、974,530は公的な割り当てに残されています。
それでは、上記のリンクの記事に戻りましょう。
UTF-8で使用されるエンコードスキームは、2という非常に大きな制限で設計されました。31 コードポイント(32,768プレーン)、エンコード可能221 4バイトに制限されている場合でも、コードポイント(32プレーン)。[3] UnicodeはコードポイントをUTF-16でエンコードできる17プレーンに制限しているため、0x10FFFFを超えるコードポイントはUTF-8およびUTF-32では無効です。
したがって、有効なUnicodeではないものをUTF-8に入れることができることがわかります。どうして? UTF-8は、Unicodeでもサポートされていないコードポイントに対応しているためです。
UTF-8は、4バイトの制限がある場合でも、2をサポートします21 コードポイント、17 * 2^16
2,164,864個の「文字」は、潜在的にUTF-8でコーディングできます。
この数は2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21であり、エンコードの仕組みに由来します。
1バイト文字のエンコードには7ビットが使用されます0xxxxxxx
(0x00-0x7F)
2バイト文字のエンコードには11ビットがあります110xxxxx 10xxxxxx
(最初のバイトは0xC0-0xDF、2番目のバイトは0x80-0xBF)
3バイト文字のエンコードには16ビットが使用されます1110xxxx 10xxxxxx 10xxxxxx
(最初のバイトは0xE0-0xEF、継続バイトは0x80-0xBF)
4バイト文字のエンコードには21ビットがあります11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(最初のバイトは0xF0-0xF7、継続バイトは0x80-0xBF)
ご覧のとおり、これは現在のUnicode(1,112,064文字)よりも大幅に大きくなっています。
UTF-8は、可変長エンコーディングで、文字ごとに8ビットの最小です。
コードポイントが高い文字は、最大32ビットかかります。
ウィキペディアからの引用:「UTF-8は、1〜4個の8ビットバイト(Unicode標準では「オクテット」と呼ばれる)を使用して、Unicode文字セット内の1,112,064コードポイントをそれぞれエンコードします。」
いくつかのリンク:
FAQエントリ、 TF-8 UTF-16、UTF-32&BOM などのUnicode規格と関連情報を確認してください。しかし、それは信頼できる情報であり、他の場所でUTF-8について読んでいるものの多くは疑わしいものです。
「UTF-8」の「8」は、ビット単位のcode unitsの長さに関連しています。コード単位は、文字をエンコードするために使用されるエンティティであり、必ずしも単純な1対1のマッピングとしてではありません。 UTF-8は、可変数のコード単位を使用して文字をエンコードします。
UTF-8でエンコードできる文字のコレクションは、UTF-16またはUTF-32、つまりすべてのUnicode文字とまったく同じです。それらはすべて、Unicodeコーディングスペース全体をエンコードします。これには、非文字や未割り当てのコードポイントも含まれます。
私は現在の最大UTF-8コード(2,164,864)についてmpenに同意しています(以下にリストされていますが、コメントすることはできませんでした)。制限とコード254および255は使用できません(4バイトの制限のみを削除しました)。
開始コード254は、開始ビット(1に設定されたマルチビットフラグ、6の1のカウント、およびターミナル0、予備ビットなし)の基本的な配置に従います。 36コード)。
開始コード255は基本的なセットアップに正確に従っていません。ターミナル0はありませんが、すべてのビットが使用されます。 ; 7 10xxxxxxグループ、追加の2 ^ 42コード)。
これらを追加すると、4,468,982,745,216の最終的な最大表示可能文字セットが得られます。これは、現在使用されているすべての文字、古い言語または使用されていない言語、および失われたと思われる言語を超えています。天使のような天体のスクリプトはありますか?
また、254および255に加えて、UTF-8標準で見落とされている/無視されているシングルバイトコードがあります:128-191、および他のいくつか。キーボードによってローカルで使用されるものもありますが、コード例128は通常、削除するバックスペースです。他の開始コード(および関連する範囲)は、1つ以上の理由により無効です( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences )。
Unicodeは、UTF-8に完全に準拠しています。 Unicodeは、UTF-8でサポートされているコードポイントとまったく同じ数の2 ^ 21コードポイント(2,097,152文字)をサポートしています。両方のシステムは、コードポイントなどに同じ「デッド」スペースと制限ゾーンを予約します ... 2018年6月現在、最新バージョンのUnicode 11.0には137,439文字のレパートリーが含まれています
Unicode標準よりUnicode FAQ
Unicode標準は、U + 0000..U + 10FFFFの範囲の文字をエンコードします。これは、21ビットのコードスペースになります。
UTF-8 Wikipediaページから。UTF-8の説明
2003年にはUnicodeコード空間が21ビット値に制限されていたため、UTF-8はコードポイントを1〜4バイトでエンコードするように定義されています...