Dialog-Fenster codepage WindowsXP
-
Hallo Leute
Ist es möglich innerhalb eines eigenen Programms eine andere codepage als die CP1252 zu benutzen?
Gruß Martin
-
Klar...
-
Würdest Du mir auch verraten wie das geht?
Gruß Martin
-
Weil Du es durch googlen selbst heruas finden kann. Wir sind hier keine Meta-Suchmascheine:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682064(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686036(v=vs.85).aspx
-
Vielen Dank erstmal für die Antwort. Natürlich habe ich Google bemüht. Beide Links beziehen sich auf die Console. Die bei WindowsXP eh mit der CP850 arbeitet. Es geht um das typische Dialogfenster. Das ist auf die CP1252 eingestellt. Ich möchte gern Text aus Edit-Feldern einschließlich Steuerzeichen direkt an einen Nadeldrucker senden der alle Sonderzeichen nur mit der CP850 korrekt druckt. Nur so ist der Ausdruck schnell und perfekt. In C/WinAPI fehlt mir die Möglichkeit z.B. über
fopen("LPT1", "w");
die codepage gleich bei der Ausgabe zu wandeln. In Java ist das mit
new PrintWriter("LPT1", "cp850");
möglich. Wenn es einen gänzlich anderen Weg gibt um dieses Problem zu lösen, bin ich für jeden Tip dankbar..
Gruß Martin
-
@Maertinibroes
Der Dialog ist unter Windows XP, Vista etc. (alle NT basierten Windosen) intern immer Unicode.
Die Codepage spielt nur eine Rolle wenn du Funktionen wieGetWindowTextA
verwendest die 8 Bit Strings zurückliefern bzw. erwarten. Die Konvertierung Unicode -> 8 Bit findet beim Aufruf dieser Funktionen statt.
Und soweit ich weiss verwenden alleGDI
bzw.USER
Funktionen zur KonvertierungCP_ACP
= die System-Default Codepage.
Und die kann man leider nicht pro Prozess einstellen (kann man nichtmal beim Starten eines neuen Prozesses ändern) -- die Einstellung ist Systemweit, und erfordert wenn ich mich richtig erinnere sogar nen Reboot (bzw. zumindest neu Einloggen).
(Das ist übrigens die "Sprache für nicht-Unicode Anwendungen" Einstellung)Was du allerdings machen kannst, ist dir den Text als Unicode zu holen (
GetWindowTextW
) und dann mittelsWideCharToMultiByte
nach Codepage 850 (oder was auch immer du willst) zu konvertieren. Das geht immer, unabhängig davon auf welche System Codepage eingestellt ist.
-
Vielen Dank für Eure Antworten. Hab es, auch wegen dem Eurozeichen, jetzt so gelöst:
#include <stdio.h> int main(int argc, char *argv[]) { FILE *f, *quelle, *ziel; int i; char fettein[] = { 27, 'E', '\0' }; // Steuerbefehle Drucker char fettaus[] = { 27, 'F', '\0' }; f = fopen("TEXT", "w"); if (f) { fprintf(f, "Hä? Für 0€ ein %sfetter Text!%s \n", fettein, fettaus); fclose(f); quelle = fopen("TEXT", "r"); ziel = fopen("lpt1", "w"); if (quelle) { if (ziel) { while ((i = fgetc(quelle)) != EOF) { switch (i) { case 0xe4: // ä i = 0x84; break; case 0xf6: // ö i = 0x94; break; case 0xfc: // ü i = 0x81; break; case 0xdf: // ß i = 0xe1; break; case 0xc4: // Ä i = 0x8e; break; case 0xd6: // Ö i = 0x99; break; case 0xdc: // Ü i = 0x9a; break; case 0xe9: // é i = 0x82; break; case 0x80: // € i = 0xee; } fputc(i, ziel); } fclose(ziel); } fclose(quelle); } } return 0; }
Gruß Martin
-
Das funktioniert nur, wenn Du den Code in Deutschland, auf einem deutschen OS compilierst. Wenn Du dies auch einem japanischen Rechner compilierst, dan geht es wieder nicht...
Fazit: Umlaute haben im Source-Code nix, aber auch gar nix verloren!!!!
-
Jochen Kalmbach schrieb:
Fazit: Umlaute haben im Source-Code nix, aber auch gar nix verloren!!!!
Absolut richtig! Dieser Quelltext dient nur der Verständlichkeit. Texte und Umlaute werden aus EditBoxen oder direkt aus der Datenbank eingelesen..
Gruß Martin
-
Dann verwende bitte passende Konvertierungs-Methoden... das Stiochwort ist hier "MultiByteToWideCHar" und "WideCharToMultiByte". Damit kannst Du von/zu jeder Encoding konvertieren. Musst aber immer über UTF-16 gehen; deshalb stellt sich für mich dir frage, warum Du nicht Dein Projekt auf UTF-16 umstellst. Dann kannst Du auch gemischte Texte aus unterschiedlichen Sprachen gleichzeitig anzeigen, was mit MBCS nicht geht...