質問: ncursesを用いてUTF8を用いて文字列を表示する下記のcプログラムを作成しコンパイル実行したところ、下記の結果の様に一行目の文字は連続して表示されていますが、二行目の文字の間に半角空白が出力されてしまい、連続して表示されません。 なぜ空白文字が出力されてしまうのでしょうか? 実行環境はUbuntu18.04LTSです。 コード ``` #include #include int main(void){ setlocale(LC_ALL, ""); initscr(); //ずれの発生しない場合 mvprintw(0, 0, "あ"); mvprintw(0, 2, "あ"); getch(); //ずれの発生する場合 mvprintw(1, 0, "■"); mvprintw(1, 2, "あ"); getch(); endwin(); } ``` 結果 ``` ああ あ ■ ```
回答: ``` $ gnome-terminal --version GNOME Terminal 3.28.2 using VTE 0.52.2 +GNUTLS -PCRE2 ``` この環境での検証を踏まえてお話させていただきます。(gnome-terminalはUbuntu18.04LTSのデフォルトの端末ソフトです。) "■"は曖昧幅の文字であってプログラムを表示させてる端末の設定によって全角幅で扱うか半角幅で扱うか異なります。 鈴木さんの環境ではちゃんと全角幅で扱われているようです。 ちゃんと全角幅で扱う設定にしても"あ"などの常に全角幅である文字とは端末ソフトによる扱いが少々異なるようです。 どのように異なるかというと"■"などの曖昧幅文字は全角幅で表示されてもx方向の大きさは1として扱われるようです。 したがって鈴木さんが書いたコードでは"■"の隣のx座標は1であるのに`mvprintw(1, 2, "あ");`と2を指定しているから1~2の間に空白が生まれると考えられます。