Proč? Na Windows máme API SetConsoleTextAttribute() a SetConsoleCursorPosition(). Není důvod aby aplikace mastily do terminálu nějaké sekvence. Nebo nedej bože abychom měli pár set typů terminálů a aplikace musely řešit, kde sehnat sekvenci pro konkrétní typ terminálu.
Pokud máte aplikaci napsanou pro Unix, tak nejspíš běží i ve Windows v terminálu který ANSI sekvence umí. Pokud ji přeložíte pro Win32, tak můžete nastavit ENABLE_VIRTUAL_TERMINAL_PROCESSING pomocí API SetConsoleMode(), a ANSI sekvence také poběží (na Win10 od revize 1607).
Ad To je vtipné :-) - souhlas, ale mluvíme každý o něčem jiném. Vy o tom že existuje spousta textových shellů. Na Windows máme cmd.exe a powershell. Na Unixech je ash, bash, csh, ksh, sh, tcsh, fish, zsh a řada dalších, nejspíš [a-z]{1,3}sh :). Ty se dají spustit na hromadě terminálů: xterm, gnome-terminal, guake, konsole, rxvt atd. V takovém kontextu je tedy opravdu vtipné, když píšete [m]ohli by se rozhodnout, jeden si vybrat a udělat ho pořádně. Jenže já mluvím o typech terminálů a terminálových sekvencích, což je ještě další kategorie.
Koukněte se na databázi terminfo, link níže. Kolik typů terminálů je tam definováno? Já jich napočítal 1693. To je shodou okolností rok kdy vyšla první verze databáze terminfo... :) Ne, bylo to okolo roku 1982. O té době vypovídá i fakt, že někteří lidé tehdy považovali za dobrý nápad mít hodinky s kalkulačkou a "melodiemi" ;)
http://invisible-island.net/datafiles/current/terminfo.src.gz
http://www.njuskalo.hr/image-bigger/muski-satovi/casio-ca-951-slika-32202984.jpg
Takže když na Unixu aplikace chce řekněme změnit barvu písma na červenou, zjistí z environment variable jaký terminál se právě používá, pak ze seznamu 1693 typů terminálů vybere ten správný, a pro vybraný terminál vyhledá sekvenci "červené písmo", kterou pak pošle na stdout. Pokud se připojíte na jiný systém (z Debianu na AIX, nebo z AIXu na HP-UX, nebo z HP-UXu na Debian; doufám že alespoň mezi distry Linuxu není problém), tak se vám nejspíš nesejde typ terminálu na obou stranách. V takovém případě vám nepůjdou šipky, F-klávesy, a dokonce ani backspace/delete(!). Fakt geniální :/
Když nejsou šipky apod., je to tím že se neshoduje typ terminálu nastavený v terminálovém emulátoru (aplikace ve které máte otevřený shell) s type který předpokládá systém na kterém ten shell běží. Jinými slovy když stisknete třeba šipku nahoru, terminál pošle shellu na stdin sekvenci znaků A, ale shell si myslí, že šipka nahoru odpovídá sekvenci B, kde A je různé od B. Předpokládám že pokud používáte Linux nebo jiný Unix, a trochu se v něm vyznáte, tak naprosto přesně víte o čem je řeč.
Ad nebo že ve Windows je atypická klávesnice, která je ovládána nestandardně - ve Windows se klávesnice čte přes API. Pokud se připojujete s Windows na Linux pomocí terminálu, tak ten terminál musí překládat události klávesnice (která klávesa byla stisknuta) na ty terminálové sekvence. Bohužel terminál neví jaké sekvence očekává druhá strana, takže snadno dojde k neshodě.