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,"fr 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
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.
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.
Hallo,
ANSI, ASCII, ISO ... alles zum Haareraufen. Ich habe jetzt folgendes
gemacht:
1
{0x1A,"Halterung ",0x06,0x09,0x00},
2
{0x00,"fr 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
Ärgere dich nicht lange rum, sondern bau den Umlaut per Hex-Code ein.
Sonst bist du immer deinem Editor und sonstigen UMgebungsbedingungen
ausgeliefert
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.
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