無知を晒す

ふだんの出来事はこっちに書いてます: http://tana.hatenablog.com

君は異体字セレクタを見たことがあるか

node v6.2.0

> var codePoints = [10548, 65039]
undefined
> var s1 = String.fromCharCode(...codePoints)
undefined
> var s2 = codePoints.map((p)=>{return String.fromCharCode(p)}).join()
undefined
> s1
'⤴️'
> s2
'⤴,️'
> s1 === s2
false
> s1.length
2
> s2.length
3
> s2.codePointAt(2)
> 44

65039異体字セレクタ (VS16) なので,これが単体で登場するというのはおかしい.

String.fromCharCode()65039 だけを与えると 44 が前に追加されて,それと 10548 を連結するので3 文字になる.ということらしい.

この 44 がどこから来たのかもうちょっと追ってみたいけど明日新幹線乗れなくなりそうなのでこの辺でやめておこうという感じ.

コメントで指摘していただいたとおり.上記のコードで .join() した時のデリミタとして , ,コードポイントでいうと 44 が入るは Array.prototype.join() の仕様でした.ということで

> var s2 = codePoints.map((p) => {return String.fromCharCode(p)}).join('')
undefined
> s2
'⤴️'

とすることで期待する挙動になりました! id:t_motooka さんありがとうございました!

参考

Variant form (Unicode) - Wikipedia

Miscellaneous Symbols and Arrows - Wikipedia

このページの一番下に,このブロックで異体字セレクタが用意されている記号について触れられている.

http://www.unicode.org/Public/UNIDATA/StandardizedVariants.txt

これは試験に出るので全部暗記しましょう.