Windows のコンソールと、Unicode のサロゲートペアとゼロ幅文字

(2019.03.20 追記:Windows7Chrome では Unicode の合字が表示されないので、合字を画像に変えました)

👨‍👩 という文字を nyagos に貼り付けると、文字化けするだけでなく、カーソル位置もおかしくなるという問題

これは2つ問題がある

  • 👨‍👩 という文字が合字である
    • 1コードポイントではなくて、「👨(U+1F468)」+ゼロ幅接合子(U+200D)+ 「👩(U+1F469)」という3コードポイントからなっている
    • nyagos は合字を想定していない
    • ゼロ幅接合子の単体の桁数は0桁である点は、go-runewidth で把握できている
  • 👨と👩各文字ともサロゲートペアで表現される
    • Windowsコマンドプロンプトサロゲートペアな Unicode の出力をサポートしていない
      • そもそもコンソールバッファのひとマスが16bitしか確保されていないんだよな
    • 実際に出力すると1文字なのに2文字と認識されたり、カーソル位置がおかしくなってしまう。
    • フォントが足りる・足りないの問題ではない

ということで「サロゲートペアな文字」も「ゼロ幅文字」もきちんと表示するのは無理とわかったので、nyagos の一行入力では <UUUUU> みたいな形で表現するようにした。^I とかと同じ扱いで、表示上は5桁になっているがバックスペース1回で削除できるし、コマンドに出力する時は元の文字に直して出力される (一応、この動作は --output-surrogate-pair というオプションで抑制する(=そのまま表示するようにする)ことが出来るようにはしておいた)

将来的にこういった文字もコマンドプロンプトで表示できるといいんですが。絵文字が使えないというのはさびしいので…(というか、将来、実用上も困るシーンが出てきそう)

本件、ご協力いただいた tsuyoshicho さん、ありがとうございました。