web-dev-qa-db-ja.com

UTF-8でエンコードできる文字数は?

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

最初の128コードポイントはASCIIの場合と同じです。しかし、UTF-8は最大100万文字をサポートできると言っていますか?

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

78
eMRe

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

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

次の1,920文字をエンコードするには2バイトが必要です。これは、ほぼすべてのラテンアルファベットの残り、ギリシャ語、キリル文字、コプト語、アルメニア語、ヘブライ語、アラビア語、シリア語、ターナのアルファベット、および発音区別符号の組み合わせを対象としています。

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

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

ソース: Wikipedia

112
zwippie

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

この表 * UTF-8shouldサポートによると:

231 = 2,147,483,648文字

ただし、RFC 3629では可能な値が制限されているため、現在は 4バイトの上限 です。これにより、

221 = 2,097,152文字

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

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

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

23
mpen

Unicode vs UTF-8

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

Unicode

Unicodeは "planes。" で指定され、各プレーンは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プレーン)、エンコード可能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

15
Evan Carroll

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

13
Ruben Reyes

UTF-8は、可変長エンコーディングで、文字ごとに8ビットの最小です。
コードポイントが高い文字は、最大32ビットかかります。

5
deceze

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

いくつかのリンク:

3
ZZ-bb

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

2

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

1
James V. Fields

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

1
Display name