Unicodeの文字数をコードポイント単位で数える
JavaScript
Array.from はサロゲートペアを考慮してコードポイントごとに正しく分割してくれる。
難しいことを考えたくなければ Array.from を使うことを推奨する。
code:getLengthByCodePoint.js
let str = "あ𠀋A😵‍💫"; // 任意の文字列(サロゲートペア、絵文字合成含む)
let codePoints = Array.from(str);
console.log(codePoints); // 'あ', '𠀋', 'A', '😵', '‍', '💫'
let count = codePoints.length;
console.log(count); // 文字数(コードポイント単位)を表示
// 多くの記事で String.codePointAt を単純に使えばよいかのように説明しているので要注意。
// codePointAt の位置は、UTF-16のワード単位になっているため、それを考慮する必要がある。
console.log(str.codePointAt(0)); // 12354 正しい('あ')
console.log(str.codePointAt(1)); // 131083 正しい('𠀋')
console.log(str.codePointAt(2)); // 56331 サロゲートペアの片割れ
console.log(str.codePointAt(3)); // 65 正しい('A')
// このため、サロゲートペアの後半の文字が取れてしまった場合の対処が必要になる。
書記素単位ではないため、この単位で文字をばらすと、壊れてしまうことがある。