clusterを正しく扱うのに少し苦労した話JavaScriptNode.jsemojiunicodeサロゲートペア皆さんはUnicodeや絵文字についてどのくらい理解していますか?私は全く理解できていません。JavaScriptで絵文字を扱おうとしたら苦労した話を書きます。誰かの参考になれば幸いです。経緯MuscularというジョークコマンドをNode.jsで開発していました。これは、ボディビルダーとともにテキストを叫んだ感じで表示するという単純なアプリケーションでした。「cowsay」と「echo-sd」と「筋肉」をあわせたようなコマンドです。絵文字が崩れれる問題このコマンドでテキストを縦書きで表示しているのですが、ここに絵文字が入ると崩れる問題が生じました。_`,これを解決する必要があります。以下のリンクを読めば今回なぜ問題が起きたのかすべてを理解できます。おける文字コードと「文字数」の数え方すばらしいまとめと説明でした。リンク先を読めばこれより下にある文章は読まなくてもJavaScriptにおける文字コード問題はほぼ解決できるでしょう。単純化して説明するために1行の文字列を縦書きで表示するプログラムで説明します。☁このコードはUTF-16において16ビットで収まる文字であれば十分機能します。U+10FFFF)に含まれる文字になると事情が異なります。1文字ではなくUTF-16のデータ16bitに一致することを表しているためのようです。いうオプションが追加されたみたいです。String.prototype.splitはUTF-16のコードユニット毎にしか分割できないため、String.prototype.matchを使う必要があります。🚽また、スプレッド構文でも分解できるようです。こっちのほうが短くて良いですね。基底文字+結合文字で1文字を表す文字列が存在します。ͥこの状態では家族は離散してしまい、お腹が痛いというメッセージも伝わらないです。この問題は「基底文字+結合文字で1文字を表す」というUnicodeにおける文字(CodePoint)と見た目の文字数が一致していないことに起因するみたいです。解決できるかもしれません。"は7文字で1文字に見える合字を表しており、このような文字はUnicode正規化では問題を解決することができません。clusterに対応するしかしながら「1文字に見える単位」にも複雑ながら定義がされているらしいです。いうUnicodeにおいて1文字に見える範囲と、その境界を判断するルールらしいです。これを実装すれば解決できそうですね.........実装できないのでライブラリ使います。使用した素晴らしいライブラリです。nͥすばらしいです!これで家族が離散しなくて済みます!まとめ文字の問題を片付け、正しく縦書きにして表示できるようになりました。フォントの問題から様々な環境では崩れるかもしれません。少なくとも私の手元の環境では崩れます。Unicodeは難しいですね。"文字"という概念を理解するのも難しそうです。何か誤っている点がありましたらご教示いただけると幸いです。requestStockLike60@amanoeseシェル芸とJSが好きな自称ふるすたっくえんじにあ。RustとElmに憧れてたり。