Unicode / 文字数ガイド

絵文字と結合文字の文字数を単位別に数える

画面で1文字に見えても、Unicode code point・JavaScriptのUTF-16 unit・UTF-8 bytesでは数が変わります。入力上限の単位を確認し、同じ単位で検算します。

「1文字」の単位を分ける

fixture表示code pointUTF-16UTF-8
emoji 😀1124
combining é1223
family171125
ascii hello5555

表示文字は利用者の見え方、code pointはUnicodeの値、UTF-16はJavaScriptのunit、UTF-8はbyteです。

fixtureで差を再現する

emoji.txtcombining.txtfamily.txtascii.txtを同じ単位で数え、expected.csvと照合します。家族絵文字はzero-width joinerを含む1つの表示列です。

const codePoints = [...text].length;
const utf16Units = text.length;
const utf8Bytes = new TextEncoder().encode(text).length;

入力上限に合わせる

  1. 上限の仕様に、表示文字・code point・UTF-16・byteのどれかを書く。
  2. 同じfixtureを指定単位で数える。
  3. 結合文字・emoji sequence・zero-width joinerを含めて検算する。
  4. checklist.mdを添えて、fit判定の単位を渡す。

このガイドはブラウザー内の静的資料です。文字列や入力内容を外部へ送信しません。

単位が不明ならfitと断定しない

「文字数」とだけ書かれた仕様では、どの数え方か確認するまで入力上限を満たすとは言いません。特にemojiと結合文字は見た目だけで判断しません。