Моя проблема показана в следующем минимальном примере:
#include <iostream>
#include <string>
#include <iomanip>
int main()
{
int width = 15;
std::cout << std::left;
std::cout << std::setw(width) << "Prints well" << std::setw(width) << "This too" << '\n';
std::cout << std::setw(width) << "\u221E" << std::setw(width) << "This not?" << '\n';
std::cout << std::setw(width+2) << "\u221E" << std::setw(width) << "This is good" << '\n';
}
Скомпилированный с помощью g++, он печатает:
Prints well This too
∞ This not?
∞ This is good
Таким образом, кажется, что символ юникода использует 3 пробела из setw вместо одного. Есть ли простой способ исправить это, не зная заранее, будет ли в строке символ юникода?
operator<<
будет использовать эквивалентstrlen(string)
для получения количества байтов, а затем дополнять пробелами, пока не достигнетsetw(width)
. Он не знает, как консоль будет отображать символы. - person Bo Persson   schedule 16.04.2018