127

UTF-8が8ビットの場合、最大256文字しか存在できないという意味ではありませんか?

最初の128コードポイントはASCIIと同じです。しかし、UTF-8は最大数百万の文字をサポートできると書いてありますか?

これはどのように作動しますか?

4

10 に答える 10

161

UTF-8は常に1バイトを使用するのではなく、1〜4バイトです。

最初の128文字(US-ASCII)には1バイトが必要です。

次の1,920文字は、エンコードするために2バイトが必要です。これは、ほとんどすべてのラテンアルファベットの残りの部分、およびギリシャ文字、キリル文字、コプティック文字、アルメニア文字、ヘブライ文字、アラビア語、シリア語、タナ文字、および合成能力ダイアクリティカルマークを対象としています。

基本多言語面の残りの部分の文字には3バイトが必要です。これには、ほとんどの中国語、日本語、韓国語の[CJK]文字を含む、一般的に使用されるほぼすべての文字[12]が含まれます。

Unicodeの他のプレーンの文字には、4バイトが必要です。これには、あまり一般的ではないCJK文字、さまざまな歴史的スクリプト、数学記号、絵文字(絵文字記号)が含まれます。

出典:ウィキペディア

于 2012-04-19T13:34:12.213 に答える
48

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で表現できます。

于 2012-04-19T13:40:04.653 に答える
35

UnicodeとUTF-8

Unicodeはコードポイントを文字に解決します。UTF-8は、Unicodeのストレージメカニズムです。Unicodeには仕様があります。UTF-8には仕様があります。どちらも制限が異なります。UTF-8には異なる上向きの境界があります。

Unicode

Unicodeは「プレーン」で指定されます。各プレーンには、216コードポイントがあります。Unicodeには17のプレーンがあります。17 * 2^16コードポイントの合計。最初の平面である平面0またはBMPは、それが運ぶものの重量が特別です。

すべてのニュアンスを説明するのではなく、飛行機に関する上記の記事を引用させてください。

17のプレーンは、1,114,112のコードポイントに対応できます。これらのうち、2,048は代理人であり、66は非文字であり、137,468は私的使用のために予約されており、974,530は公的割り当てのために残されています。

UTF-8

次に、上記のリンク先の記事に戻りましょう。

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

于 2017-07-11T18:58:39.833 に答える
30

この表によると*UTF-8は以下をサポートする必要があります。

2 31 =2,147,483,648文字

ただし、RFC 3629は可能な値を制限していたため、現在は4バイトに制限されています。

2 21 =2,097,152文字

これらの文字のかなりの部分はカスタム使用のために「予約」されていることに注意してください。これは実際にはアイコンフォントに非常に便利です。

*使用されているウィキペディアは6バイトのテーブルを表示します-それ以来、記事を更新しています。

2017-07-11:複数のバイトでエンコードされた同じコードポイントをダブルカウントするように修正されました

于 2016-07-20T18:38:26.410 に答える
28

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文字)よりも大幅に大きくなっています。

アップデート

追加のルールを考慮していないため、最初の計算は間違っています。詳細については、この回答へのコメントを参照してください。

于 2017-10-29T12:08:12.207 に答える
9

UTF-8は、 1文字あたり最低8ビットの可変長エンコーディングです。 コードポイントが高い文字は最大32ビットを使用します。

于 2012-04-19T13:35:11.483 に答える
4

Wikipediaからの引用:「UTF-8は、1〜4個の8ビットバイト(Unicode標準では「オクテット」と呼ばれる)を使用して、Unicode文字セットの1,112,064コードポイントのそれぞれをエンコードします。」

いくつかのリンク:

于 2012-04-19T13:35:18.507 に答える
1

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コーディングスペース全体をエンコードします。これには、文字以外のコードポイントや割り当てられていないコードポイントも含まれます。

于 2012-04-19T14:25:54.680 に答える
0

現在の最大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)。

于 2016-08-14T21:52:59.020 に答える
-2

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バイトでエンコードするように定義されています...

于 2018-11-26T21:29:25.390 に答える