UTF-8が8ビットの場合、最大256文字しか存在できないという意味ではありませんか?
最初の128コードポイントはASCIIと同じです。しかし、UTF-8は最大数百万の文字をサポートできると書いてありますか?
これはどのように作動しますか?
UTF-8が8ビットの場合、最大256文字しか存在できないという意味ではありませんか?
最初の128コードポイントはASCIIと同じです。しかし、UTF-8は最大数百万の文字をサポートできると書いてありますか?
これはどのように作動しますか?
UTF-8は常に1バイトを使用するのではなく、1〜4バイトです。
最初の128文字(US-ASCII)には1バイトが必要です。
次の1,920文字は、エンコードするために2バイトが必要です。これは、ほとんどすべてのラテンアルファベットの残りの部分、およびギリシャ文字、キリル文字、コプティック文字、アルメニア文字、ヘブライ文字、アラビア語、シリア語、タナ文字、および合成能力ダイアクリティカルマークを対象としています。
基本多言語面の残りの部分の文字には3バイトが必要です。これには、ほとんどの中国語、日本語、韓国語の[CJK]文字を含む、一般的に使用されるほぼすべての文字[12]が含まれます。
Unicodeの他のプレーンの文字には、4バイトが必要です。これには、あまり一般的ではないCJK文字、さまざまな歴史的スクリプト、数学記号、絵文字(絵文字記号)が含まれます。
出典:ウィキペディア
UTF-8は、文字ごとに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は「プレーン」で指定されます。各プレーンには、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プレーン)というはるかに大きな制限で設計されており、 4バイトに制限されている場合でも2 21コードポイント(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
この表によると*UTF-8は以下をサポートする必要があります。
2 31 =2,147,483,648文字
ただし、RFC 3629は可能な値を制限していたため、現在は4バイトに制限されています。
2 21 =2,097,152文字
これらの文字のかなりの部分はカスタム使用のために「予約」されていることに注意してください。これは実際にはアイコンフォントに非常に便利です。
*使用されているウィキペディアは6バイトのテーブルを表示します-それ以来、記事を更新しています。
2017-07-11:複数のバイトでエンコードされた同じコードポイントをダブルカウントするように修正されました
2,164,864の「文字」は、UTF-8でコード化できる可能性があります。
この数は、エンコーディングが機能する方法に由来します。27 + 211 + 216 + 221
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は、 1文字あたり最低8ビットの可変長エンコーディングです。
コードポイントが高い文字は最大32ビットを使用します。
Wikipediaからの引用:「UTF-8は、1〜4個の8ビットバイト(Unicode標準では「オクテット」と呼ばれる)を使用して、Unicode文字セットの1,112,064コードポイントのそれぞれをエンコードします。」
いくつかのリンク:
Unicode標準と、FAQエントリ、UTF-8 UTF-16、UTF-32、BOMなどの関連情報を確認してください。それはそれほどスムーズな航海ではありませんが、それは信頼できる情報であり、他の場所でUTF-8について読むかもしれないことの多くは疑わしいものです。
「UTF-8」の「8」は、ビット単位のコード単位の長さを表します。コードユニットは、文字をエンコードするために使用されるエンティティであり、必ずしも単純な1対1のマッピングとしてではありません。UTF-8は、可変数のコード単位を使用して文字をエンコードします。
UTF-8でエンコードできる文字のコレクションは、UTF-16またはUTF-32の場合とまったく同じです。つまり、すべてのUnicode文字です。これらはすべて、Unicodeコーディングスペース全体をエンコードします。これには、文字以外のコードポイントや割り当てられていないコードポイントも含まれます。
現在の最大UTF-8コード(2,164,864)についてmpenに同意しますが(以下にリストされていますが、彼についてはコメントできません)、UTF-8の2つの主要な制限(4バイトのみ)を削除すると、彼は2レベルずれます。制限とコード254および255は使用できません(彼は4バイトの制限を削除しただけです)。
開始コード254は、開始ビットの基本的な配置(1に設定されたマルチビットフラグ、6 1のカウント、および端子0、スペアビットなし)に従い、6つの追加バイト(6つの10xxxxxxグループ、追加の2 ^)を処理します。 36コード)。
開始コード255は基本設定に正確には従わず、端子0は使用されませんが、すべてのビットが使用され、7つの追加バイトが提供されます(マルチビットフラグが1に設定され、7 1のカウント、すべてのビットが使用されるため、端子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は、特に2 ^ 21コードポイント(2,097,152文字)をサポートします。これは、UTF-8でサポートされているコードポイントとまったく同じ数です。両方のシステムは、コードポイントなどのために同じ「デッド」スペースと制限されたゾーンを予約します。... 2018年6月の時点で、最新バージョンのUnicode 11.0には、137,439文字のレパートリーが含まれています。
Unicode標準から。 Unicode FAQ
Unicode標準は、U + 0000..U + 10FFFFの範囲の文字をエンコードします。これは、21ビットのコードスペースに相当します。
UTF-8Wikipediaページから。 UTF-8の説明
2003年にはUnicodeコードスペースが21ビット値に制限されていたため、UTF-8はコードポイントを1〜4バイトでエンコードするように定義されています...