絵文字の文字列長:1つの絵文字が7つ以上のコードポイントになる理由

なぜ1つの絵文字のJavaScript .lengthが11以上になるのかを発見します。シンプルな絵文字、スキントーン修飾子、ZWJシーケンス、国旗絵文字をカバーします。

Emoji

詳細な説明

絵文字の長さ:複雑です

絵文字は文字列長の驚きの最も一般的な原因です。1文字に見えるものが2から25以上のUTF-8バイトになることがあります。

絵文字の複雑さレベル

レベル1:シンプルな絵文字(1コードポイント、2 UTF-16コードユニット)

😀  U+1F600  .length = 2  UTF-8: 4バイト

レベル2:スキントーン付き(2コードポイント、4 UTF-16コードユニット)

👋🏾  U+1F44B U+1F3FE  .length = 4  UTF-8: 8バイト

レベル3:ZWJシーケンス(U+200Dで結合された複数のコードポイント)

👨‍💻  U+1F468 U+200D U+1F4BB  .length = 5  UTF-8: 11バイト
(男性テクノロジスト = 男性 + ZWJ + ラップトップ)

レベル4:複雑な家族絵文字

👨‍👩‍👧‍👦  U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466
.length = 11  UTF-8: 25バイト  書記素: 1

国旗絵文字(地域インジケーター)

国旗絵文字は地域インジケーターシンボル(U+1F1E6–U+1F1FF)のペアを使用:

🇯🇵  = U+1F1EF U+1F1F5 (JP)  .length = 4  UTF-8: 8バイト
🇺🇸  = U+1F1FA U+1F1F8 (US)  .length = 4  UTF-8: 8バイト

比較表

絵文字 書記素 コードポイント .length UTF-8バイト
😀 1 1 2 4
👋🏾 1 2 4 8
🇯🇵 1 2 4 8
👨‍💻 1 3 5 11
👨‍👩‍👧‍👦 1 7 11 25

なぜ重要か

Twitterの「280文字」制限は実際には.lengthではなく加重スキームでカウントします。文字カウンターを構築する場合、常にコードユニットやコードポイントではなく書記素クラスターをカウントしてください。

ユースケース

ソーシャルメディアアプリケーション、チャットシステム、または絵文字入力を許可する文字制限付きUIを構築する際、絵文字エンコーディングの複雑さを理解することは、正確な文字カウント、ストレージ推定、データ切り詰めの防止に不可欠です。

試してみる — String Length Calculator

フルツールを開く