高校倫理1437640 views
数学講師2873614 views
高校国語787186 views
高校化学2919622 views
小学理科718778 views
Computer366970 views
雑学1473252 views
いろは3002230 views
MathPython495041 views
高校日本史190258 views

絵文字を含む文字列を一文字ずつ分割するときは 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

となっています。正規表現の . は任意の文字を表します。