Привет!
Есть таблица некоторых строковых переменных (string). Необходимо эту таблицу вывести в адекватном форматированном виде. Проблема заключается в том, что при использовании манипулятора setw () строки, разные по длине, занимают разную ширину поля, а не фиксированную.
#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, "");
Заметьте, что консольный ввод/вывод приложения должен быть либо полностью «узкий», либо полностью «широкий»: переключиться после первого выведенного символа уже нельзя.
Комментариев нет:
Отправить комментарий