/* ------------------------------------------------------------- utf8_demo.c Farben- und UTF8-Zeichenverwendung in Konsolenprogrammen 04.07.2026 R. Seelig ------------------------------------------------------------- */ #include #include #include #include #include // ------------------------------------------------------------------------------------ // Prototypen und extern Variable // ------------------------------------------------------------------------------------ // Variable extern uint8_t textattr; extern const uint8_t ega_colors[8]; extern const uint8_t UTF_chars[384]; // Farben und Cursorposition void settextattr(uint8_t attr); void settextcolor(uint8_t col); void setbkcolor(uint8_t col);; void gotoxy(uint8_t x, uint8_t y); void clrscr(void); // UTF-8 Zeichen void utfputchar(uint8_t ch); void uprintf(const char *fmt, ...); // ganz ganz "boeser Hack": originales printf wird "abgeschaltet" und durch // das uprintf von hier ersetzt !!! #define printf uprintf // ------------------------------------------------------------------------------------ // Farben // ------------------------------------------------------------------------------------ // Farbreihenfolge der EGA-Standardfarben enum { black, blue, green, cyan, red, magenta, brown, grey, darkgrey, lightblue, lightgreen, lightcyan, lightred, lightmagenta, yellow, white }; // Array mit der Zuordnung der EGA-Farben zu den Codes der ESC-Sequenzen const uint8_t ega_colors[8] = { // sw bl gn cy rt mg br gr 30, 34, 32, 36, 31, 35, 33, 37 }; uint8_t textattr = 0x07; // -------------------------------------------------- // settextattr // // setzt die Text UND die Hintergrundfarbe mit der // in ATTR angegebenen Farbe. Die hoeherwertigen // 4 Bits bestimmen die Hintergrundfarbe, die // niederen 4 Bits die Vordergrundfarbe. // -------------------------------------------------- void settextattr(uint8_t attr) { uint8_t bk, vg; uint8_t bright = 0; uint8_t fg_code, bg_code; textattr = attr; vg = attr & 0x0F; // Textfarbe bk = (attr >> 4) & 0x0F; // Hintergrundfarbe if (vg > 7) { bright = 1; vg &= 7; } fg_code = ega_colors[vg]; bg_code = ega_colors[bk & 7] + 10; if (bk > 7) { bg_code += 0x3c; // 0x3c .. 0x43 => intensive Hintergrundfarben } printf("\033[%d;%d;%dm", bright, fg_code, bg_code); } // -------------------------------------------------- // gotoxy // // positioniert den Textcursor an die mit x/y // angegebene Textkoordinate. // -------------------------------------------------- void gotoxy(uint8_t x, uint8_t y) { printf("\033[%d;%dH",y,x); } // -------------------------------------------------- // settextcolor // Setzt die Textvordergrundfarbe mit der // in angegebenen Textfarbe (EGA - // kompatibel) // -------------------------------------------------- void settextcolor(uint8_t col) { settextattr( (textattr & 0xf0) | col); } // -------------------------------------------------- // setbkcolor // Setzt die Texthintergrundfarbe mit der // in angegebenen Textfarbe (EGA - // kompatibel) // -------------------------------------------------- void setbkcolor(uint8_t col) { settextattr( (textattr & 0x0f) | (col << 4) ); } // -------------------------------------------------- // clrscr // // loescht den Bildschrim mit der mit // angegebenen Farbe // -------------------------------------------------- void clrscr(void) { printf("\033[2J\033[H"); gotoxy(1,1); } // Ende Farben // ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------ // UTF-8 // ------------------------------------------------------------------------------------ // UTF-8 Codes, die den ASCII Zeichen 128..255 der // DOS - Codepage 437 entsprechen const uint8_t UTF_chars[384] = { 0xC3,0x87,0x00, // ASCII-128 0xC3,0xBC,0x00, // ASCII-129 0xC3,0xA9,0x00, // ASCII-130 0xC3,0xA2,0x00, // ASCII-131 0xC3,0xA4,0x00, // ASCII-132 0xC3,0xA0,0x00, // ASCII-133 0xC3,0xA5,0x00, // ASCII-134 0xC3,0xA7,0x00, // ASCII-135 0xC3,0xAA,0x00, // ASCII-136 0xC3,0xAB,0x00, // ASCII-137 0xC3,0xA8,0x00, // ASCII-138 0xC3,0xAF,0x00, // ASCII-139 0xC3,0xAE,0x00, // ASCII-140 0xC3,0xAC,0x00, // ASCII-141 0xC3,0x84,0x00, // ASCII-142 0xC3,0x85,0x00, // ASCII-143 0xC3,0x89,0x00, // ASCII-144 0xC3,0xA6,0x00, // ASCII-145 0xC3,0x86,0x00, // ASCII-146 0xC3,0xB4,0x00, // ASCII-147 0xC3,0xB6,0x00, // ASCII-148 0xC3,0xB2,0x00, // ASCII-149 0xC3,0xBB,0x00, // ASCII-150 0xC3,0xB9,0x00, // ASCII-151 0xC3,0xBF,0x00, // ASCII-152 0xC3,0x96,0x00, // ASCII-153 0xC3,0x9C,0x00, // ASCII-154 0xC2,0xA2,0x00, // ASCII-155 0xC2,0xA3,0x00, // ASCII-156 0xC2,0xA5,0x00, // ASCII-157 0xE2,0x82,0xA7, // ASCII-158 0xC6,0x92,0x00, // ASCII-159 0xC3,0xA1,0x00, // ASCII-160 0xC3,0xAD,0x00, // ASCII-161 0xC3,0xB3,0x00, // ASCII-162 0xC3,0xBA,0x00, // ASCII-163 0xC3,0xB1,0x00, // ASCII-164 0xC3,0x91,0x00, // ASCII-165 0xC2,0xAA,0x00, // ASCII-166 0xC2,0xBA,0x00, // ASCII-167 0xC2,0xBF,0x00, // ASCII-168 0xE2,0x8C,0x90, // ASCII-169 0xC2,0xAC,0x00, // ASCII-170 0xC2,0xBD,0x00, // ASCII-171 0xC2,0xBC,0x00, // ASCII-172 0xC2,0xA1,0x00, // ASCII-173 0xC2,0xAB,0x00, // ASCII-174 0xC2,0xBB,0x00, // ASCII-175 0xE2,0x96,0x91, // ASCII-176 0xE2,0x96,0x92, // ASCII-177 0xE2,0x96,0x93, // ASCII-178 0xE2,0x94,0x82, // ASCII-179 0xE2,0x94,0xA4, // ASCII-180 0xE2,0x95,0xA1, // ASCII-181 0xE2,0x95,0xA2, // ASCII-182 0xE2,0x95,0x96, // ASCII-183 0xE2,0x95,0x95, // ASCII-184 0xE2,0x95,0xA3, // ASCII-185 0xE2,0x95,0x91, // ASCII-186 0xE2,0x95,0x97, // ASCII-187 0xE2,0x95,0x9D, // ASCII-188 0xE2,0x95,0x9C, // ASCII-189 0xE2,0x95,0x9B, // ASCII-190 0xE2,0x94,0x90, // ASCII-191 0xE2,0x94,0x94, // ASCII-192 0xE2,0x94,0xB4, // ASCII-193 0xE2,0x94,0xAC, // ASCII-194 0xE2,0x94,0x9C, // ASCII-195 0xE2,0x94,0x80, // ASCII-196 0xE2,0x94,0xBC, // ASCII-197 0xE2,0x95,0x9E, // ASCII-198 0xE2,0x95,0x9F, // ASCII-199 0xE2,0x95,0x9A, // ASCII-200 0xE2,0x95,0x94, // ASCII-201 0xE2,0x95,0xA9, // ASCII-202 0xE2,0x95,0xA6, // ASCII-203 0xE2,0x95,0xA0, // ASCII-204 0xE2,0x95,0x90, // ASCII-205 0xE2,0x95,0xAC, // ASCII-206 0xE2,0x95,0xA7, // ASCII-207 0xE2,0x95,0xA8, // ASCII-208 0xE2,0x95,0xA4, // ASCII-209 0xE2,0x95,0xA5, // ASCII-210 0xE2,0x95,0x99, // ASCII-211 0xE2,0x95,0x98, // ASCII-212 0xE2,0x95,0x92, // ASCII-213 0xE2,0x95,0x93, // ASCII-214 0xE2,0x95,0xAB, // ASCII-215 0xE2,0x95,0xAA, // ASCII-216 0xE2,0x94,0x98, // ASCII-217 0xE2,0x94,0x8C, // ASCII-218 0xE2,0x96,0x88, // ASCII-219 0xE2,0x96,0x84, // ASCII-220 0xE2,0x96,0x8C, // ASCII-221 0xE2,0x96,0x90, // ASCII-222 0xE2,0x96,0x80, // ASCII-223 0xCE,0xB1,0x00, // ASCII-224 0xC3,0x9F,0x00, // ASCII-225 0xCE,0x93,0x00, // ASCII-226 0xCF,0x80,0x00, // ASCII-227 0xCE,0xA3,0x00, // ASCII-228 0xCF,0x83,0x00, // ASCII-229 0xC2,0xB5,0x00, // ASCII-230 0xCF,0x84,0x00, // ASCII-231 0xCE,0xA6,0x00, // ASCII-232 0xCE,0x98,0x00, // ASCII-233 0xCE,0xA9,0x00, // ASCII-234 0xCE,0xB4,0x00, // ASCII-235 0xE2,0x88,0x9E, // ASCII-236 0xCF,0x86,0x00, // ASCII-237 0xCE,0xB5,0x00, // ASCII-238 0xE2,0x88,0xA9, // ASCII-239 0xE2,0x89,0xA1, // ASCII-240 0xC2,0xB1,0x00, // ASCII-241 0xE2,0x89,0xA5, // ASCII-242 0xE2,0x89,0xA4, // ASCII-243 0xE2,0x8C,0xA0, // ASCII-244 0xE2,0x8C,0xA1, // ASCII-245 0xC3,0xB7,0x00, // ASCII-246 0xE2,0x89,0x88, // ASCII-247 0xC2,0xB0,0x00, // ASCII-248 0xE2,0x88,0x99, // ASCII-249 0xC2,0xB7,0x00, // ASCII-250 0xE2,0x88,0x9A, // ASCII-251 0xE2,0x81,0xBF, // ASCII-252 0xC2,0xB2,0x00, // ASCII-253 0xE2,0x96,0xA0, // ASCII-254 0xC2,0xA0,0x00 // ASCII-255 }; // -------------------------------------------------------- // utfputchar // // gibt ein durch einen Index > 127 (Pseudo-Ascii) // addressiertes UTF-8 Zeichen aus // -------------------------------------------------------- void utfputchar(uint8_t ch) { int i; if (ch< 128) { putchar(ch); } else { i= (ch-128) * 3; putchar(UTF_chars[i]); if ((UTF_chars[i] & 0xE0) == 0xC0) { putchar(UTF_chars[i+1]); } else if ((UTF_chars[i] & 0xF0) == 0xE0) { putchar(UTF_chars[i+1]); putchar(UTF_chars[i+2]); } } } /* -------------------------------------------------------- uprintf printf-Version, die die Ausgabe einer Codepage 437 mittels UTF-8 emuliert und somit die Ausgabe eines einzelnen Asciicodezeichens 128..255 ermoeglicht. Usage: // 248 ist Zeichen fuer hochgestelltes o = Celcius temp= 22.8; uprintf("Die Temperatur ist: %.2f %cC",temp, 248); -------------------------------------------------------- */ void uprintf(const char *fmt, ...) { char txtbuf[2000]; char *s; va_list args; va_start(args, fmt); vsnprintf(txtbuf, sizeof(txtbuf), fmt, args); va_end(args); s= &txtbuf[0]; while (*s) { utfputchar(*s); s++; } } // Ende UTF8 // ------------------------------------------------------------------------------------ /* -------------------------------------------------------- utf8_asciitable Demo: zeigt die Zeichen der Codepage 437 ueber UTF-8 an -------------------------------------------------------- */ void utf8_asciitable(void) { int i; uint8_t asciirow = 0; const uint8_t charperrow = 12; settextattr(0x07); clrscr(); printf("\n\r"); settextattr(0x1e); printf(" ------------------------------------------------------------------------ \n\r"); printf(" Ascii-Zeichen der Codepage 437 mittels UTF8 angezeigt \n\r"); printf(" ------------------------------------------------------------------------ "); settextattr(0x07); gotoxy(3,7); for (i= 32; i< 256; i++) { if (i< 100) utfputchar(' '); printf("%d: ",i); utfputchar(i); printf(" "); asciirow++; if (asciirow== charperrow) { printf("\n\r "); asciirow= 0; } } printf("\n\n\r"); } /* ------------------------------------------------------------------------- main ------------------------------------------------------------------------- */ int main(void) { uint8_t ohmchar, celciuschar; float temp, wid; utf8_asciitable(); ohmchar= 234; celciuschar= 248; temp= 22.35; wid= 1.5; printf(" Ein Text mit CodePage 437 Zeichen\n\r" " Temperatur: %.2f %cC\n\r" " Widerstand: %.2f K%c\n\n\r", temp, celciuschar, wid, ohmchar); return 0; }