std::setw и символ Юникода

Моя проблема показана в следующем минимальном примере:

#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 вместо одного. Есть ли простой способ исправить это, не зная заранее, будет ли в строке символ юникода?


person user119879    schedule 16.04.2018    source источник
comment
Здравствуйте и добро пожаловать в StackOverflow. Хороший первый вопрос.   -  person YSC    schedule 16.04.2018
comment
Возможный дубликат cout ‹‹ setw неправильно сочетается с åäö   -  person YSC    schedule 16.04.2018
comment
Хотя я проверил его на вашем конкретном случае и не получил удовлетворительного результата.   -  person YSC    schedule 16.04.2018
comment
operator<< будет использовать эквивалент strlen(string) для получения количества байтов, а затем дополнять пробелами, пока не достигнет setw(width). Он не знает, как консоль будет отображать символы.   -  person Bo Persson    schedule 16.04.2018
comment
Я пробовал то же самое, что и @YSC, но у меня та же проблема, когда вместо знака бесконечности печатается вопросительный знак. Я также пытался изменить свою основную программу (которая теперь использует std::wofstream), но там я столкнулся с эта проблема. Я нахожусь в системе Linux, где мне не разрешено ничего устанавливать, поэтому я могу просто удалить это и использовать инфу вместо юникода.   -  person user119879    schedule 16.04.2018
comment
ответ зависит от операционной системы и компилятора   -  person Barmak Shemirani    schedule 16.04.2018