標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

☭(U+262D)のコマンドプロンプトに置ける文字の幅問題

☭という記号がある。「鎌と槌」(HAMMER AND SICKLE)と呼ばれる記号で、いわゆる共産党のシンボルである。

この文字、East_Asian_Width は Neutral になっているWikipediaの東アジアの文字幅によると

UAX#11では、これらの特性を次のように解釈することを推奨している。

Unicode のテキストを東アジアの従来文字コードの文脈で扱う場合
- 特性値Na(狭)またはN(中立)を持つ文字は、半角の文字 (halfwidth) として扱う
  :
Unicode のテキストを東アジア以外の従来文字コードの文脈で扱う場合
- 特性値Na(狭)またはN(中立)を持つ文字は、幅の狭い文字 (narrow) として扱う。

であるため、規格上はいわゆる「半角文字」である。

が、コマンドプロンプトで実際に出力すると、セルを二つ消費する。つまり、「全角文字」相当になっている。

これが原因で go-runewidth をそのまま使って、文字の桁数を計算することができなくなっている。仕方がないので、実際にコマンドプロンプトに出力した時のカーソル移動量で文字の桁数を求めている。

NYAGOS の一行入力パッケージでは、極力 go-colorable によるエスケープシーケンスだけで処理を済まそうとしているが、一部どうしてもコンソールの API を直接呼び出している。この文字桁問題がなければ、ひとつ直接呼出しが減らせるんだけどな…