|
Von Oem zu Ansi
Von Uwe Holz
Letzte Änderung:
Sonntag, 28. Dezember, 2003
Mehr Informationen zu Oem- und Ansi-Zeichensätzen finden Sie unter anderem auf der Homepage von Microsoft.
Die Konvertierung von alten DOS-Daten erfordert normalerweise eine entsprechende Oem2Ansi-Konverierung. Kein Problem, werden Sie zunächst meinen, schließlich besitzt Windows alle erforderlichen Mittel, um diesen Job zu erledigen. Ja, das mag zwar so stimmen, doch wie immer gibt es auch hier ein "aber", denn was ist wenn:
- Sie plattformübergreifend entwickeln (Linux-Version der Funktionen - Fehlanzeige) ?
- Sie verschiedene Sprachen unterstützen müssen ?
- Sie eine Sprache unterstützen wollen, deren Regeln für die Oem/Ansi-Konvertierung Sie nicht einmal kennen ?
Der folgende Beitrag beschreibt eine allgemeine Lösung des Problems, die auf einer templatebasierten Konvertierung von Oem zu Ansi beruht.
Technischer Hintergrund
Windows-Programme benutzen den Ansi-Zeichensatz, der unter DOS nicht bekannt ist. Der DOS-Zeichensatz, auch als DOS/OEM-Zeichensatz bekannt, enthält wiederum Zeichen zur Darstellung von Rahmen, Boxen und Linien, die unter Windows unbekannt sind. Beide Zeichensätze unterscheiden sich grundsätzlich in den Zeichen über 127. Die Zeichen 0 - 127 sind für alle Ansi- und Oem-Sätze gleich.
Windows besitzt dafür Funktionen wie OemToAnsi(), OemToChar(), OemToCharBuff() und andere.
Um die Sache aber richtig komplex zu machen, ist diese Konvertierung auch noch von der jeweiligen Landessprache abhängig und es handelt sich nicht einmal um eine Eins-Zu-Eins-Umsetzung der entsprechenden Zeichen, selbst wenn man bei einer Sprache bleibt. Es ist also ziemlich offensichtlich, dass diese Konvertierung immer wieder zu Problemen und Irritationen führt.
Die Lösung
Der beste Ansatz, solche Probleme zu lösen, ist eine beliebige Konfigurierbarkeit über eine entsprechende Datei. Diese könnte z.B. alle Oem-Codes über 127 und ihre entsprechenden ANSI-Codes enthalten. Das Programm liest diese Datei beim Start ein und alle später folgenden Oem/Ansi-Konvertierungen basieren auf der in ihr definierten Zuordnung.
Die CGI-Version des Tools kann direkt hier getestet werden. Geben Sie dazu die entsprechende Datei für den Upload an. Im Gegenzug erhalten Sie das Ergebnis der Konvertierung als Datei-Download. Vergessen Sie nicht, die Sprache für die Konvertierung einzugeben, sonst erhalten Sie deutsche Oem/Ansi-Umsetzung:
Hinweis: Bitte nur Text-Dateien konvertieren. Dateien, die Binärdaten enthalten, können zwar konvertiert werden, aber das Ergebnis ist wahrscheinlich wenig brauchbar. Die Daten werden auf dem Server nicht gespeichert sondern lediglich konvertiert. Alle dabei entstehenden temporären Daten werden noch während der Verarbeitung des Requests wieder gelöscht.
Kommandozeilen-Argumente
Die Kommandozeilen-Version des Tools können Sie hier herunterladen und dann selber testen. Der Source-Code ist ebenfalls dabei . Er basiert standardmässig auf deutscher Oem/Ansi-Konvertierung (Setup-Datei german.oem), die mit der Option oem2ansi=mylanguage.oem überschrieben werden kann. Als weiteres Argument muss die Datei angegeben werden, die zu konvertieren ist:
c:\> oem2ansi.exe file=<DBF/CSV source file> [<oemtab=mylanguage.oem>]
Linux version:
lx:/temp # oem2ansi.bin file=<DBF/CSV source file> [<oemtab=mylanguage.oem>]
Beispiel 1:
Aufruf von oem2ansi.exe unter Windows (W9x, W2K, XP) um die Datei readme.txt mit deutschen Oem-Zeichen zu konvertieren:
c:\temp> oem2ansi.exe file=readme.txt oemtab=german.oem
Beispiel 2: Aufruf der Linux-Version um die Datei readme.ger zu konvertieren:
lx:/tmp # oem2ansi.bin file=readme.ger
Falls Sie eine andere Plattform als Win32 oder Linux benutzen, so können Sie die im Zip-Archiv befindlichen Quelldateien auch selbst auf dem Zielsystem kompilieren. Dazu brauchen Sie lediglich die Projektdatei makefile.linux etwas anzupassen. Den entsprechenden GNU-C++ Compiler vorausgesetzt lassen sich die Quelldateien neben den genannten Plattformen auch auf MacOSX und SunSolaris kompilieren.
Wie erzeuge ich ein Template für eine andere Sprache?
Wenn Sie eine andere Sprache einstellen (mylanguage.oem), muss die Datei mylanguage.oem natürlich vorhanden sein. Befindet sie sich nicht im Archive, so kann die Datei sozusagen im Eigenbau erstellt werden. Jedem Oem-Code (128 bis 255) auf der linken Seite des Gleichheitszeichens ist dazu der entsprechende Ansi-Code (rechte Seite) zuzuordnen. Die deutsche Version des Template sieht wie folgt aus:
; File: german.oem
[OEM2ANSI]
128=199
129=252
130=233
...
253=178
254=166
255=160
Aber auch ohne konkrete Kenntnisse der genauen Übersetzung von Oem nach Ansi in der gewünschten Sprache braucht man nicht zu verzagen sondern einfach die Windows-Installation befragen. Falls die gewünschte Landessprache eingestellt ist, braucht man zur Erzeugung der gewünschten Oem-Datei lediglich das Tool oemtab.exe zu starten. Vorausgesetzt, das Archive wurde im Verzeichnis c:\temp\oem2ansi-1.0 entpackt, sind dazu folgende Schritte durchzuführen:
c:\> cd \temp\oem2ansi-1.0\bin
c:\temp\oem2ansi-1.0\bin> oemtab.exe
Das gewünschte Template (.oem-Datei) wird sich nun im Verzeichnis befinden. Der Quellcode für das Tool oemtab.exe ist übrigens denkbar einfach. Das Programm macht nämlich nichts anderes, als die Win32-API-Function OemToCharBuff() für jedes einzelne Oem-Zeichen zwischen 128 und 255 aufzurufen und die Codes als Zahlenpaare in der Oem-Datei abzuspeichern:
for (i = 128; i < 256; i++)
{
c = i;
OemToCharBuff( (char *)&c, (char *)&c, 1);
sprintf(szLine, "%d=%u\r\n", i, c);
strcat(szOutBuf, szTemp);
}
Falls Sie am kompletten Quellcode dieses kleinen Tools interessiert sind, so folgen Sie einfach dem Link und laden sich die Datei doemtab-10.zip herunter.
|