Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Lettische OEM-Zeichen auf russischem Drucker (https://www.delphipraxis.net/102044-lettische-oem-zeichen-auf-russischem-drucker.html)

uligerhardt 22. Okt 2007 17:30


Lettische OEM-Zeichen auf russischem Drucker
 
Also, erstmal vorneweg: Ich würde auch lieber Unicode verwenden und auf irgendwelche OEM-Codierungen verzichten, aber das betroffene Programm lebt seit TurboPascal-Zeiten und ist halt gewachsen.

Nun wollen unsere Kunden in Lettland (die russische Betriebssysteme benutzen) einige Strings, die aus OEM-codierten Dateien kommen, auf Lettisch gedruckt haben. Ich löse das jetzt testhalber so (in der Kurzfassung):
Delphi-Quellcode:
MultiByteToWideChar(775, ...); // 775 = OEM-Codepage baltisch
WideCharToMultiByte(1257, ...); // 1257 = Windows-Codepage baltisch
Printer.Charset := 186 // baltisches Charset
Writeln(Lst, ...);
Das funktioniert auch. Bevor ich das jetzt fest in die Anwendung einbaue und entsprechende Konfigurationsmöglichkeiten schaffe, wollte ich aber mal fragen, ob das irgendwie eleganter geht. Z.B., ob das Betriebssystem irgendeinen Zusammenhang zwischen den drei Konstanten 775/1257/186 kennt, ob ich die beiden ersten Schritte zu einem Analogon von OemToChar mit einem Extra-Parameter zusammenfassen kann (ohne Umweg über einen temporären WideString), etc.pp.

Vielen Dank im Voraus für die zahlreichen Kommentare! :wink:
Uli.

Ydobon 23. Okt 2007 00:50

Re: Lettische OEM-Zeichen auf russischem Drucker
 
Eine MultiByteToMultiByte Funktion wäre mir unbekannt und würde sicher selbst in einem OS nicht anders als über den Unicode"umweg" realisiert werden, mit diesem tempären WideString (die Funktion selbst bräuchte letztlich nur wenige Zeilen - welche du schnell schreiben kannst).
Es wäre ziemlicher Aufwand für jede mögliche Copdepage<->Codepage Konvertierung die notwendigen Tabellen herumzuschleppen, es genügen nur die, mit der diese jeweils auf eine allgemeingültige (dafür wird eben Unicode verwendet) eineindeutig abgebildet werden.
Langer Rede kurzer Sinn, ich denke, du hast schon die beste Methode gefunden.

uligerhardt 23. Okt 2007 08:13

Re: Lettische OEM-Zeichen auf russischem Drucker
 
Zitat:

Zitat von Ydobon
Langer Rede kurzer Sinn, ich denke, du hast schon die beste Methode gefunden.

Danke, das beruhigt mich schon mal.

Zitat:

Zitat von Ydobon
Eine MultiByteToMultiByte Funktion wäre mir unbekannt und würde sicher selbst in einem OS nicht anders als über den Unicode"umweg" realisiert werden, mit diesem tempären WideString (die Funktion selbst bräuchte letztlich nur wenige Zeilen - welche du schnell schreiben kannst).

So eine Routine hab ich jetzt schon. Dazu noch eine technische Frage: Ich hab das jetzt mit jeweils zwei Aufrufen von MultiByteToWideChar und WideCharToMultiByte gelöst: Einmal, um die nötige Pufferlänge zu bestimmen, und dann nochmal, um die eigentliche Konvertierung zu erledigen. Geht das einfacher? Bei meinen ersten Versuchen hatten alle Puffer die gleiche Länge (jeweils in Chars bzw. WideChars gemessen) und das hat funktioniert, aber dem Frieden hab ich nicht getraut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz