и чтобы закрыть тему окончательно:
Code: Select all
#include <stdio.h>
#include <windows.h>
int main(int argc,char *argv[])
{
CHAR_INFO buffer[2]={{0x200e,0x17},{0x2013,0x17}};
SMALL_RECT result={0,10,1,10};
WriteConsoleOutputW(GetStdHandle(STD_OUTPUT_HANDLE),buffer,{2,1},{0,0},&result);
printf("%d %d %d %d\n",result.Left,result.Top,result.Right,result.Bottom);
return 0;
}
закрашивается два знакоместа. текст затирается тоже под два знакоместа. возвращается информация о выводе прямоугольника 2x1 знакомест. реально на экране текст в одно знакоместо.
теперь меняем атрибут второго символа на любой другой. всё остаётся по прежнему, кроме того, символы попадают в разные знакоместа. это, кстати, возможная причина, почему у 2useven10 ничего не съезжает. режим, где разделитель другого цвета.
выводы:
1. всё консольное апи заточено под то, что один CHAR_INFO занимает одно знакоместо на экране. т.е. исторически один ucs-2 символ на одно знакоместо. даже не utf-16. то что в msdn сделали глобальную замену ucs-2 на utf-16 — по факту для консоли ничего не поменяло.
2. для оптимизации скорости последовательность символов с одинаковыми отрибутами выводится за раз одним PolyTextOutW со всеми вытекающими отсюда проблемами.
3. майкрософт об этом в курсе, но творят какую-то странную фигню. вместо того, чтобы оставить старое апи для совместимости и добавить новых функций, городят всевозможную эвристику.