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
これは試験に出るので全部暗記しましょう.