Forum: Compiler & IDEs c: printf-Align und UTF-8


von Xxx X. (blubbb)


Lesenswert?

Mein Problem lässt sich gut mit
https://www.onlinegdb.com/online_c_compiler
demonstrieren.

Code:
1
#include <stdio.h>
2
3
int main() {
4
  printf("'%10s'\n", "gut");
5
  printf("'%10s'\n", "scheiße");
6
  return 0;
7
}

Ausgabe:
1
'       gut'
2
'  scheiße'

Es geht um das Padding mit Leerzeichen und das offensichtliche Problem 
mit UTF-8 ('ß' > 127). Gibt es da eine elegante Lösung, sodass das 
Alignment auch mit solchen Zeichen korrekt funktioniert?

von Xxx X. (blubbb)


Lesenswert?

Unelegant ist so:
1
#include <stdio.h>
2
3
static int utf8diff(const char *s) {
4
    int len = 0;
5
    while (*s) if ((*s++ & 0xC0) == 0x80) len++;
6
    return len;
7
}
8
9
int main() {
10
  printf("'%*s'\n", 10+utf8diff("gut"), "gut");
11
  printf("'%*s'\n", 10+utf8diff("scheiße"), "scheiße");
12
  return 0;
13
}

von Bauform B. (bauformb)


Lesenswert?

Für ein uC-Programm kann man die Option -fexec-charset=ISO8859-15 
benutzen. Der gcc Konvertiert dann den utf-8-Quelltext, und printf() 
arbeitet mit einem reinen 8-Bit-Zeichensatz. (Mit ISO8859-1 fehlt 
hauptsächlich das '€').

Kombiniert mit -finput-charset= kann auch die Umgebung und der Quelltext 
eine beliebige Kodierung benutzen.

https://gcc.gnu.org/onlinedocs/cpp/Character-sets.html

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Die Alternative wäre es, den Quelltext gar nicht erst in utf-8 zu 
speichern, sondern in einem reinen 8-Bit-Format -- aber das hängt 
natürlich vom Zielsystem ab, auf dem das resultierende Programm 
verwendet werden soll.

Als Konsolenanwendung für Windows wäre CP437/CP850 angebracht, als 
"normale" Windows-Anwendung hingegen CP1252 (was weitestgehend ISO8859-1 
entspricht).

Wenn es aber auf einem µC laufen soll, hängts davon ab, worauf die Texte 
ausgegeben werden sollen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.