Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

setw задаёт разную ширину поля вывода строк

Привет! Есть таблица некоторых строковых переменных (string). Необходимо эту таблицу вывести в адекватном форматированном виде. Проблема заключается в том, что при использовании манипулятора setw () строки, разные по длине, занимают разную ширину поля, а не фиксированную.
#include #include #include
using namespace std;
int main () { string one = "Один", two = "Два", eight = "Восемь"; cout << setw (10) << one <Ожидаемый вывод:
один два восемь
Что выходит на самом деле:
один два восемь
Собственно вопрос - почему так? И как всё таки можно выводить строки выровненными - одну под другой?


Ответ

Эх. Судя по всему, это проблемы интернационализации и utf-8.
Дело в том, что C++ не знает об utf-8, и считает ширину поля в байтах, а не в реальных символах. А для utf-8 количество байт не равно количеству символов. Обратите внимание, что у вас ширина поля получилась не 10, а меньше — текст "Один" в utf-8 занимает больше четырёх байт, поэтому количество недостающих до 10 байт меньше.
Попробуйте перейти на широкие строки:
wstring one = L"Один", two = L"Два", eight = L"Восемь"; wcout << setw (10) << one << endl; wcout << setw (10) << two << endl; wcout << setw (10) << eight << endl;
Если вы работаете под Windows, вам придётся прибегнуть к небольшой акробатике, чтобы заставить консоль правильно понимать широкие строки. Под линуксом, кажется, достаточно в начале программы применить заклинание
setlocale(LC_ALL, "");
Заметьте, что консольный ввод/вывод приложения должен быть либо полностью «узкий», либо полностью «широкий»: переключиться после первого выведенного символа уже нельзя.

Комментариев нет:

Отправить комментарий