絵文字を含む文字列を一文字ずつ分割するときは split('') でなくサロゲートペアの正規表現を使う
絵文字などを含むテキストを一文字ずつ分割するとき、split(‘’) は予期しない結果を返します。
const word = 'AB😀C'
const items = word.split('')
console.log(items)
// ['A', 'B', '\uD83D', '\uDE00', 'C']絵文字がコードポイントに分解してしまいました。JavaScript の String は UTF-16 をもとに開発されており、😀は UTF-16 のサロゲートペアで表現されているからです。
次の例も JavaScript の String を理解する助けになります。
const word = 'AB😀C'
console.log(word.length)
// 5😀は 2 文字としてカウントされています。
split('') の代替
正規表現と match を使うと、絵文字も一文字として分割できます。
const word = 'AB😀C'
const array = word.match(/([\uD800-\uDBFF][\uDC00-\uDFFF])|./g)
console.log(array)
// ['A', 'B', '😀', 'C']サロゲートペアは上位サロゲートと下位サロゲートのペアで
上位 D800 - DBFF
下位 DC00 - DFFF
となっています。正規表現の . は任意の文字を表します。