potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

JavaScript 文字列をUnicodeコードポイントへ変換する

本文

以下のコードで文字列をUnicodeコードポイントの配列に変換できます。

Array.from("🍎🍊😁", s => s.codePointAt(0));
// Array(3) [ 127822, 127818, 128513 ]

関数にしておくと便利かもしれません。

const getCodePointsFromString = (source) => {
    if (typeof source != "string") return undefined;
    return Array.from(source, s => s.codePointAt(0));
}

getCodePointsFromString("🍊🍎😁");
// Array(3) [ 127822, 127818, 128513 ]

このコードでは以下を利用しています。

  • 文字列のイテレーターはコードポイント(単位の文字列)を返す(参考:MDN
  • 文字列からコードポイント(整数)への変換はString.prototype.codePointAt()メソッド(参考:MDN)。
  • Array.from()メソッドは第1引数に配列や反復可能オブジェクト、第2引数に変換関数を受け取る(参考:MDN)。

文字列のイテレーターが反復するオブジェクトがコードポイント単位の文字列であることは次のコードで確認できます。

console.log(Array.from("🍎🍊😁", s => [s, typeof(s)]));
// (3) […]
// 0: Array [ "🍎", "string" ]
// 1: Array [ "🍊", "string" ]
// 2: Array [ "😁", "string" ]

備考1:文字列のlengthプロパティはUTF-16コードユニット数

なお、文字列のlengthプロパティはUTF-16コードユニット数を返すことに注意してください。次のようにサロゲートペアが含まれる場合に結果が異なります。

"🍎🍊😁".length // 6
Array.from("🍎🍊😁", s => s.codePointAt(0)).length // 3

備考2:スプレッド構文は新しい配列を作る

スプレッド構文...iteratorにより文字列のイテレーターを配列に変換することもできます。ただし、この場合はコードポイントに対応する文字を要素とした新しい配列が作成されます。

[..."🍎🍊😁"].map(s => s.codePointAt(0))
// Array(3) [ 127822, 127818, 128513 ]