Forum: Mikrocontroller und Digitale Elektronik SDCC und Strings mit Umlauten


von StefanK. (Gast)


Lesenswert?

Hallo Forumsmitglieder,

ich bin gerade dabei ein umfangreiches Programm von Pascal nach C zu 
portieren. Im Programm werden viele Textstrings in verschiedenen 
Sprachen verwendet. Ich habe mir ein array of struct gebaut das im 
Codebereich abgelegt wird. Nun ist es aber so, dass die Strings auch 
Umlaute enthalten, mit denen kommt der SDCC aber anscheinend nicht 
zurecht. Hier ein Ausschnitt in C:
1
 
2
    {0x1A,"Halterung          ",0x06,0x09,0x00},
3
    {0x00,"fr Folien-        ",0x00,0x0A,0x00},
4
    {0x00,"aufnahme           ",0x00,0x08,0x00},
5
    {0x00,"nach oben          ",0x00,0x09,0x00},
6
    {0x00,"rechts             ",0x00,0x06,0x00},
7
    {0x00,"schwenken          ",0x00,0x09,0x00},

und das macht der Compiler daraus:
1
.db #0x1A  ; 26
2
  .ascii "Halterung          "
3
  .db 0x00
4
  .db #0x06  ; 6
5
  .db #0x09  ; 9
6
  .db #0x00  ; 0
7
  .db #0x00  ; 0
8
  .ascii "f"
9
  .db 0xFC
10
  .ascii "r Folien-        "
11
  .db 0x00
12
  .db #0x00  ; 0
13
  .db #0x0A  ; 10
14
  .db #0x00  ; 0
15
  .db #0x00  ; 0
16
  .ascii "aufnahme           "
17
  .db 0x00
18
  .db #0x00  ; 0
19
  .db #0x08  ; 8
20
  .db #0x00  ; 0
21
  .db #0x00  ; 0
22
  .ascii "nach oben          "
23
  .db 0x00
24
  .db #0x00  ; 0
25
  .db #0x09  ; 9
26
  .db #0x00  ; 0
27
  .db #0x00  ; 0
28
  .ascii "rechts             "
29
  .db 0x00
30
  .db #0x00  ; 0
31
  .db #0x06  ; 6
32
  .db #0x00  ; 0
33
  .db #0x00  ; 0
34
  .ascii "schwenken          "
35
  .db 0x00
36
  .db #0x00  ; 0
37
  .db #0x09  ; 9
38
  .db #0x00  ; 0

Das erste Byte im struct ist die Nummer des Textes, dann kommt der Text 
als
String, danach Anzahl der Zeilen, die eigentliche Länge des Strings und 
ein Teiler, der woanders im Programm Verwendung findet.

Weiß jemand, wie ich dem SDCC die ASCII-Zeichen für Umlaute beibringen 
kann?

Gruß Stefan

von Εrnst B. (ernst)


Lesenswert?

StefanK. schrieb:
>... ich dem SDCC die ASCII-Zeichen ...

Da ist das Problem. ASCII hat keine Umlaute.

der SDCC ignoriert das und hat exakt das "0xFC", dass in deinem 
Quelltext anstelle des 'ü' steht, in den ASM-Code übernomen.

Lösung => Speicher deinen Quelltext in dem Zeichensatz ab, den du 
nachher auch in deinen ASM-String-Konstanten haben willst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

0xFC ist der Zeichencode für das Zeichen "ü" in der Codepage 1252 
("Windows ANSI") bzw. in ISO8859-1.

Das ist also vom Compiler vollkommen korrekt umgesetzt worden.

von Matthias K. (matthiask)


Lesenswert?

Alles so lassen und nur in der Ausgaberoutine der Texte eine Umkodierung 
vornehmen.

von StefanK. (Gast)


Lesenswert?

Hallo,

ANSI, ASCII, ISO ... alles zum Haareraufen. Ich habe jetzt folgendes 
gemacht:
1
{0x1A,"Halterung          ",0x06,0x09,0x00},
2
    {0x00,"fr Folien-        ",0x00,0x0A,0x00},
3
    {0x00,"aufnahme           ",0x00,0x08,0x00},

Das Zeichen, das hier an Stelle des "ü" erscheint, ist das Zeichen, das 
im Editor erscheint wenn man über die Zifferntasten mit gedrückter 
ALT-Taste die Zahl 0129 eingibt.

Der Compiler macht folgendes daraus:
1
.db #0x1A  ; 26
2
  .ascii "Halterung          "
3
  .db 0x00
4
  .db #0x06  ; 6
5
  .db #0x09  ; 9
6
  .db #0x00  ; 0
7
  .db #0x00  ; 0
8
  .ascii "f"
9
  .db 0xC2
10
  .db 0x81
11
  .ascii "r Folien-        "
12
  .db #0x00  ; 0
13
  .db #0x0A  ; 10
14
  .db #0x00  ; 0
15
  .db #0x00  ; 0
16
  .ascii "aufnahme           "

Er hat jetzt den richtigen Wert 0x81 eingefügt, aber wo kommt das 0xC2 
her?

Gruß Stefan

von Karl H. (kbuchegg)


Lesenswert?

Ärgere dich nicht lange rum, sondern bau den Umlaut per Hex-Code ein. 
Sonst bist du immer deinem Editor und sonstigen UMgebungsbedingungen 
ausgeliefert
1
#define UMLAUT_U  "\x81"
2
3
...
4
5
   {0x00,"f" UMLAUT_U "r Folien-        ",0x00,0x0A,0x00},

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

StefanK. schrieb:
> Er hat jetzt den richtigen Wert 0x81 eingefügt, aber wo kommt das 0xC2
> her?

Dein Quelltext ist jetzt UTF-8-codiert. Ich bezweifle, daß das sinnvoll 
ist.

von StefanK. (Gast)


Lesenswert?

Hallo Rufus, Karlheinz und die Anderen,

danke für Eure Hilfe, es hat jetzt geklappt, der Editor war tatsächlich 
noch auf UTF-8, keine Ahnung warum, hatte das vorhin vermutlich mal 
umgestellt.

Es funktioniert jetzt wenn man mit ALT + Ziffernblock den ASCII-Code 
eingibt, dann hat man zwar im Editor komische Zeichen, aber im Code 
stimmt es dann.

Gruß Stefan

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.