同じ文字列を4つの基準で数える

Moyoutilの空白を含む数は[...s].lengthで計算します。これはコードポイントを数え、JavaScriptのs.lengthはUTF-16コード単位を数えます。例には人物のコードポイント4つとU+200Dの接続文字3つがあり、合計7です。UTF-16長は11、TextEncoderで得るUTF-8長は25バイトです。

const s = "👨‍👩‍👧‍👦";
[...s].length // 7
s.length // 11
new TextEncoder().encode(s).length // 25
家族絵文字の書記素1、コードポイント7、UTF-16単位11、UTF-8バイト25の比較図
直接実行した計算の図です。数値は別々の集計単位で、箱の面積は比率を表しません。絵文字の描画ではなく計算基準を示します。

ECMAScript: String iterator · WHATWG: TextEncoder

文字の境界と入力制限

Unicode UAX #29は拡張書記素クラスタの境界を説明し、絵文字ZWJシーケンス内を分割しない規則を定めます。この例をIntl.Segmenterのgrapheme設定で実行すると1つになります。書記素の境界は実際の描画やすべての提出フォームの文字数規則を保証しません。

const segmenter = new Intl.Segmenter("en", {
  granularity: "grapheme"
});
[...segmenter.segment(s)].length // 1

Unicode UAX #29: Grapheme Cluster Boundaries

Moyoutilは書記素数やUTF-16長を別の統計として提供しません。文字数・バイト計算機にこのシーケンスを入れると空白込み7、空白なし7、UTF-8バイト25を確認できます。制限が文字、バイト、UTF-16単位のどれか確認し、提出先で最終検査してください。接続文字を消すと元のシーケンスが変わります。

よくある質問

すべての絵文字が7文字ですか?

いいえ。この特定の家族シーケンスの結果です。コードポイントが違えば数も変わります。空文字列のコードポイント、UTF-16、UTF-8、書記素数はすべて0です。