本文
以下のコードで文字列を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 ]