It's probably intended, that ::mbrtowc behaves differently since glibc-2.22.
> cout << mbrtowc( &wc, "a", 0, &ps ) << endl;
It used to return 0 if a 0 size was passed, now it's 'size_t(-2)'.
Zypper falls back to use plain string sizes, thus MB and ANSI SGR sequences
cause miss-alignment.
Using 'zypper --no-color' or output to non-terminal should give correct results
aslong as not MB sequences are involved.