53319


ncursesを用いてUTF8を用いて文字列を表示する下記のcプログラムを作成しコンパイル実行したところ、下記の結果の様に一行目の文字は連続して表示されていますが、二行目の文字の間に半角空白が出力されてしまい、連続して表示されません。  
なぜ空白文字が出力されてしまうのでしょうか？  
実行環境はUbuntu18.04LTSです。  
コード

[code]

    #include<ncurses.h>
    #include<locale.h>
    
    int main(void){
        setlocale(LC_ALL, "");
        initscr();
    
        //ずれの発生しない場合
        mvprintw(0, 0, "あ");
        mvprintw(0, 2, "あ");
        getch();
        //ずれの発生する場合
        mvprintw(1, 0, "■");
        mvprintw(1, 2, "あ");
        getch();
    
    
        endwin();
    }
    
[/code]

結果

[code]

    ああ
    あ ■
    
[/code]


CC BY-SA 4.0
2019-03-09T02:52:36.930
53313
2019-03-09T11:20:28.277
32203
question
c
ncursesでの文字の表示で半角空白が余分に表示される

[code]

    $ gnome-terminal --version
    GNOME Terminal 3.28.2 using VTE 0.52.2 +GNUTLS -PCRE2
    
[/code]

この環境での検証を踏まえてお話させていただきます。(gnome-terminalはUbuntu18.04LTSのデフォルトの端末ソフトです。)

"■"は曖昧幅の文字であってプログラムを表示させてる端末の設定によって全角幅で扱うか半角幅で扱うか異なります。  
鈴木さんの環境ではちゃんと全角幅で扱われているようです。  
ちゃんと全角幅で扱う設定にしても"あ"などの常に全角幅である文字とは端末ソフトによる扱いが少々異なるようです。  
どのように異なるかというと"■"などの曖昧幅文字は全角幅で表示されてもx方向の大きさは1として扱われるようです。  
したがって鈴木さんが書いたコードでは"■"の隣のx座標は1であるのに`mvprintw(1, 2,
"あ");`と2を指定しているから1~2の間に空白が生まれると考えられます。


CC BY-SA 4.0
2019-03-09T11:20:28.277
53319
2019-03-09T11:20:28.277
32475
53313
answer