揮発性のメモ2

知識をメモ書きしておく

printfでUTF8混じりの文字列の最大文字数を指定する

printfで文字列の最大文字数を指定する - 揮発性のメモ2

1234567890123456
じゃがいも      :A
^^^^^^^^^^^^^^^^
↑16文字        

日本語混じりで桁を揃えてprintfで出力したい
localeをちゃんと設定してwcharを使うべきだが、できないときもある
環境を整えたくないので、とりあえずできる限りの手抜きをする

   // 補正前
   printf("%-16s:A", "じゃがいも");
   printf("%-16s:A", "ターボR");
1234567890123456
じゃがいも :A
ターボR      :A

ずれてしまう。
なぜかというと、UTF8では日本語は3バイトだが表示上は2文字分のため UTF8の文字数分だけ誤差が出る。
つまり、UTF8の文字数だけprintfの幅を足してしまえばいい


超簡易的に判定するなら、UTF8の文字数を足す

int count8(const char *s)
{
    int len = 0;
    while(*s){
        if((*s & 0xC0) == 0xC0) len++; 
        s++;
    }
    return len;
}
   printf("%-*s:A", 16+count8("じゃがいも"), "じゃがいも");
   printf("%-*s:A", 16+count8("ターボR"), "ターボR");
1234567890123456
じゃがいも      :A
ターボR         :A


当然3バイト文字にしか対応していないので、これ以上のことをするならきちんと環境をととのえること