banner.jpg
Web-Development und Tools Powered by WebSellerTM

 

Home

Praxis-Tips
  Umlaute/UTF-8
  Normalisierung
  OemToAnsi
  MySQL-Import
  Site-Suche
  City Desk
  DynDNS
  MXLookup
  SPAM

SDT

Support
  Downloads
  Kontakt

Impressum

Englisch

RSS Feed

Suche:

Web Search

Made with CityDesk


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:

OEM-Datei:
Oem/Ansi-Konvertierung:

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.