文字数の数え方: UTF-16・コードポイント・書記素

UTF-16の単位、コードポイント、書記素クラスタの違いと、絵文字や結合文字を含む文字列で文字数がずれる理由、正しい数え方を解説します。

String.lengthの意味

String.lengthはUTF-16のコードユニット数です。絵文字や一部の漢字は、2と数えられます。[...文字列].lengthならコードポイント数で数えられます。

見た目の1文字

Intl.Segmenterでgranularityをgraphemeにすると、見た目の1文字ごとに分けられます。ZWJで結合された家族の絵文字などは、複数のコードポイントで1文字になります。

正規化とバイト数

normalize('NFKC')を使うと、全角と半角の英数字を揃えて比較できます。バイト数はTextEncoder().encode(文字列).lengthで求まり、UTF-8では日本語の文字は多くが3バイトです。

この技術を使っているツール

ほか71本のツールでも使っています。