c ++ - Windows version af wcswidth\_l

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har nogle tekst til at skrive til Windows-konsollen, at jeg har brug for at kende den virkelige bredde i kolonner. wcswidth\_l synes at være den bedste mulighed på platforme, der har det (selvom mbswidth\_l() ville være bedre, da jeg ikke har lyst til at bruge wchar\_t, men af ​​en eller anden grund det ikke eksisterer). Men i tillæg til andre platforme har brug for noget, der virker på Windows. Selv om det er usandsynligt, at der er en bærbar løsning, ved jeg ikke om nogen løsning overhovedet på Windows. Jeg tror, ​​at konsollen har en API for at få markørposition og sådan, så jeg kunne skrive teksten ud og kontrollere ændringen i position. Det ville være nøjagtigt, men det er ikke acceptabelt, men at skrive ud ekstra output er slet ikke acceptabelt.


Hvordan går det at få kolonnebredden af ​​en streng eller et tegn på Windows?


Redigere:


wcswidth\_l returnerer antallet af konsolkolonner, der bruges til at vise en streng. Nogle tegn optager en kolonne og andre, f.eks. japanske tegn, tag op to.


Som et eksempel er 'kolonnebredden' af 'a あ' fire. 'a' er en, '' er en, og 'あ' er to. (Forudsat at konsollen er konfigureret til faktisk at vise non-ascii-tegn, der er). Det er også godt, hvis API'en understøtter strenge ved hjælp af kodeks 65001 (UTF-8).

Bedste reference


Først og fremmest er Windows Console API placeret her. [9]


For det andet er den funktion du leder efter GetConsoleFontSize? [10]


Jeg vil forsøge at skrive et eksempel hurtigt på et sekund.


EDIT: Her går du. Tilgiv mig, hvis det er en lille fejl. Jeg fandt faktisk det var endnu nemmere. GetCurrentConsoleFont udfylder en COORD struktur på vej til dig for at få indekset til at passere til GetConsoleFontSize, så trin gemt :)


#define \_WIN32\_WINNT 0x0501 //XP, 0x0601=windows 7
#include <windows.h>

int main()
{
    HANDLE hStdOutput = GetStdHandle (STD\_OUTPUT\_HANDLE);

    CONSOLE\_FONT\_INFO cfi;
    GetCurrentConsoleFont (hStdOutput, FALSE, &cfi);

    //cfi.dwFontSize.X == x size
    //cfi.dwFontSize.Y == y size
}


REDIGERE:


Hvis du ikke er opmærksom på usynlig produktion, kan du bruge CreateConsoleScreenBuffer stort set at have et usynligt konsolvindue på din kommando, mens du forlader din upåvirket. GetConsoleScreenBufferInfoEx vil fortælle markørpositionen, hvor du kan brug WriteConsole til at skrive til din buffer (usynligt), og kontroller markørens placering igen i forhold til antallet af tegn, der faktisk er skrevet. Bemærk at det ikke er nødvendigt at slette skærmen for at bruge denne metode, hvis du markerer markørens placering på forhånd.


Hvis du ikke har råd til at gøre ekstra output, synlig eller usynlig, er jeg ikke sikker på, at der virkelig er en mulighed.

Andre referencer 1


Bærbar tilgang



Da tegnets bredde afhænger mere af tegnene i stedet for det system, de vises på (ok, der kan være overfald, men de skal være ret sjældne), man kan bruge en separat funktion til at gøre det (også på Windows). Dette kræver Unicode-tegn, da det gør det meget nemmere at analysere bredden af ​​strenge, men man kan sikkert skrive et omslag til at konvertere mellem kodninger.


Tilgængelig implementering



Her er en passende og bærbar implementering, som man kan plugge ind i sin applikation og tilbagesendelse for at bruge den på Windows. [11]