c: printf-Align und UTF-8

OP #7455246
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?

OP #7455248
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
}
#7455523
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

#7455648
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.