同じ文字列を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文字の境界と入力制限
Unicode UAX #29は拡張書記素クラスタの境界を説明し、絵文字ZWJシーケンス内を分割しない規則を定めます。この例をIntl.Segmenterのgrapheme設定で実行すると1つになります。書記素の境界は実際の描画やすべての提出フォームの文字数規則を保証しません。
const segmenter = new Intl.Segmenter("en", {
granularity: "grapheme"
});
[...segmenter.segment(s)].length // 1Unicode UAX #29: Grapheme Cluster Boundaries
Moyoutilは書記素数やUTF-16長を別の統計として提供しません。文字数・バイト計算機にこのシーケンスを入れると空白込み7、空白なし7、UTF-8バイト25を確認できます。制限が文字、バイト、UTF-16単位のどれか確認し、提出先で最終検査してください。接続文字を消すと元のシーケンスが変わります。
よくある質問
すべての絵文字が7文字ですか?
いいえ。この特定の家族シーケンスの結果です。コードポイントが違えば数も変わります。空文字列のコードポイント、UTF-16、UTF-8、書記素数はすべて0です。