Vreemde tekens in console tonen
Niets is zo leuk als de vreemdste UNICODE tekens op het scherm tonen. In oude console-games werden deze tekens vaak gebruikt om complexe tekeningen op het scherm te tonen. Om je ietwat saaie applicaties dus wat toffer te maken, leg ik daarom uit hoe je dit kan doen.

UNICODE karakters tonen
Je toetsenbord heeft maar een beperkt aantal toetsen. Er zijn echter tal van andere tekens gedefinieerd die console-applicaties ook kunnen gebruiken. We zagen reeds dat al deze tekens, UNICODE-karakters, een eigen unieke code hebben die je kan opzoeken om vervolgens dat teken in je code te gebruiken.
Dit gaat als volgt in z’n werk:
- Zoek het teken(s) dat je nodig hebt in een UNICODE-tabel1 en noteer de hexadecimale waarde.
- Zet als allereerste lijn in je
Main(dus nog vóór je iets metConsole.WriteofWriteLinenaar het scherm stuurt):Console.OutputEncoding = System.Text.Encoding.UTF8;. Zet je deze lijn pas later, dan kan tekst die je daarvoor al toonde verkeerd verschijnen. - Je kan nu op 2 manieren dit teken op het scherm krijgen.
Stel je voor dat we het copyright karakter wensen te gebruiken (de letter c in een cirkeltje) in onze applicatie. Deze heeft hexadecimale UNICODE waarde 0x00A9.
Die 0x vooraan zag je al bij de literals: het getal erna is hexadecimaal geschreven. Je telt dan met zestien cijfers, 0 tot 9 en daarna A tot F. UNICODE-tabellen geven hun codes altijd zo. 0x00A9 is gewoon het getal 169 (A staat voor 10, en 10 × 16 + 9 = 169). Ook de letter 'A' uit de vorige sectie heeft zo’n code: 0x0041, oftewel 65.
Manier 1: copy/paste
Kopieer het karakter zelf en plaats het in je code waar je het nodig hebt, bijvoorbeeld:
Console.WriteLine("<plak hier je speciale teken>"); Merk op dat niet alle lettertypes dit karakter kennen en dus mogelijk als een vierkantje dit op je scherm zullen tonen. Dit hangt af van het lettertype dat jouw shell-venster gebruikt. In Windows Terminal (de standaard op Windows 11) is dat zelden een probleem, zelfs voor emoji. In het oudere zwarte consolevenster en in de Debug Console van Visual Studio gebeurt het wel nog. Dat gaat enkel over het lettertype: de UTF-8-lijn uit stap 2 heb je ook in Windows Terminal nodig. Zonder die lijn wordt een emoji op een Belgische pc twee vraagtekens.
Manier 2: hexadecimale code casten naar char
Casting leg ik pas in het volgende hoofdstuk uit, maar het kan geen kwaad om al eens een voorproefje hiervan te krijgen.
Noteer de hexadecimale code van het karakter dat in de tabel staat. In dit geval is dat dus 0x00A9. Om dit teken te tonen schrijf je dan:
char copyright = (char)0x00A9;
Console.WriteLine(copyright);Dit kan ook korter. Door gebruik te maken van de \u-notatie om hexadecimale waarden voor te stellen:
Console.WriteLine("\u00A9");
En emoji? De \u-notatie verwacht exact vier hexadecimale cijfers, en een char kan enkel tekens tot en met 0xFFFF bevatten. Emoji zitten daarboven: een lachend gezichtje is bijvoorbeeld 0x1F600, en (char)0x1F600 compileert dan ook niet. Wil je toch een emoji tonen, dan gebruik je de \U-notatie (hoofdletter U) met acht cijfers, of je plakt de emoji gewoon in je string zoals bij manier 1:
Console.WriteLine("\U0001F600");UNICODE-kunst tonen
Soms zou je multiline UNICODE-kunst (ook wel ASCII-art genoemd) willen tonen in je C# applicatie. Dit kan je eenvoudig oplossen door gebruik te maken van het @ teken voor een string.
Stel dat je een toffe titel of tekening bijvoorbeeld via ASCIIflow.com maakt. Je kan het resultaat eenvoudig naar je klembord kopiëren en vervolgens in je C#-code integraal copy pasten als literal voor een string op voorwaarde dat je het laat voorafgaan door @" en uiteraard eindigt met ";.
Bijvoorbeeld:
string myname = @"
___________________
\__ ___/\______ \
| | | | \
| | | ` \
|____| /_______ /
\/ ";
Console.WriteLine(myname);Zowel de $-notatie (voor string interpolatie) als het @-teken kan je gecombineerd gebruiken bij een string. De volgorde maakt niet uit: zowel $@"..." als @$"..." is toegelaten en doet exact hetzelfde.
Console.WriteLine($@"1+1={1+1}. \tGeen tab");Dit geeft als output (ordt door het apenstaartje genegeerd):
1+1=2. \tGeen tab
Raw string literals
Het @-teken heeft één nadeel: alles tussen de aanhalingstekens hoort bij de string, ook de spaties waarmee je je code inspringt. Je tekening moet dus tegen de linkerkantlijn plakken, anders krijg je die inspringing mee op het scherm. Sinds C# 11 is er een modernere manier: de raw string literal. Je begint en eindigt de string met drie aanhalingstekens, elk op een eigen lijn:
string myname = """
___________________
\__ ___/\______ \
| | | | \
| | | ` \
|____| /_______ /
\/
""";
Console.WriteLine(myname);De positie van de sluitende """ bepaalt wat er weggeknipt wordt: alle lijnen ertussen moeten minstens even ver ingesprongen zijn als die sluitende """, en precies die inspringing verdwijnt uit het resultaat. Backslashes, aanhalingstekens en escape-codes zoals \t worden net als bij @ letterlijk genomen. Ook hier kan je een $ voor zetten om interpolatie te gebruiken: $"""...""".
Je zal @"..." nog vaak tegenkomen in bestaande code en in code die AI-tools genereren. Beide manieren werken.
Het ultieme spel gemaakt uit niets dan tekens is nog altijd Dwarf Fortress. Tarn Adams begon eraan in 2002, het jaar van GTA Vice City en Morrowind, en bracht de eerste publieke versie uit in 2006. Terwijl de rest van de wereld in 3D speelde, bouwde je daar een dwergenkolonie in een raster van letters.
En dat ding zat fenomenaal diep. Elke dwerg heeft een eigen humeur, een eigen geschiedenis en eigen voorkeuren, de wereld wordt laag per laag gesimuleerd en zelfs het water zoekt zijn weg door je gangen. Brakke graphics, en toch bleven mensen er jaren in hangen. Het bewijst nog maar eens dat een sexy frontend minder waard is dan een backend die gewoon werkt. En dat laatste is net waar jij nu voor aan het studeren bent.
In de vorige sectie legde ik uit dat we tekst kunnen formateren als een geld bedrag m.b.v. Console.WriteLine($"{12.3456:C}");.
Het probleem was dat het euro-teken als een ? op het scherm verscheen. Dat komt omdat een consolevenster op Windows standaard met een beperkte tekenset van 256 tekens werkt (op een Belgische pc is dat code page 850, een tabel uit de tijd van MS-DOS), en het euroteken zit daar niet in. Met de UTF-8-encoding kan de console elk UNICODE-teken aan:
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine($"{12.3456:C}");Zie je bij jou meteen een euroteken, ook zonder die eerste lijn? Dan staat je Windows al ingesteld op UTF-8 (een optie onder de taalinstellingen). Bij je medestudenten is dat mogelijk niet zo, dus zet die lijn er toch maar altijd bij.
Ooit een mail gekregen waarin Café als Café stond, of een prijs met € in plaats van een euroteken? Dan heb je mojibake gezien, Japans voor “tekens die van gedaante veranderd zijn”.
Het gebeurt telkens een programma tekst leest met een andere tekentabel dan waarmee ze geschreven werd. In UTF-8 bestaat de
éuit twee bytes:C3enA9. Een programma dat denkt dat het met een oude tabel van 256 tekens te maken heeft (zoals Windows-1252, familie van de code page 850 van je console), maakt daar twee tekens van:Ãen©. Het euroteken is in UTF-8 zelfs drie bytes, en zo wordt het€.
Het ultieme spel gemaakt uit niets dan tekens is nog altijd Dwarf Fortress. Tarn Adams begon eraan in 2002, het jaar van GTA Vice City en Morrowind, en bracht de eerste publieke versie uit in 2006. Terwijl de rest van de wereld in 3D speelde, bouwde je daar een dwergenkolonie in een raster van letters.