TPrinter Unicode Text

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

TPrinter Unicode Text

Beitrag von RugiaArt »

Hallo!

folgendes Problem:

Code: Alles auswählen

 
  var MeinText:string;
  begin
    MeinText  := 'Umlaute ÖÄÜ'; 
    Printer.BeginDoc;
    Printer.Canvas.Font.Size:=24;
    Printer.Canvas.Font.Name:='Arial';
    Printer.Canvas.TextOut(X, Y, MeinText);
    Printer.EndDoc;
  end;

Text wird nicht mit Umlauten ausgegeben, sondern mit Fragezeichen ("Umlaute ???"). In welcher Form soll ich dem Printer mein Text übergeben?

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: TPrinter Unicode Text

Beitrag von theo »

Auf Windows? Müsste eigentlich gehen, oder?
Welche Kodierung hat deine Quelldatei?

Versuch mal so:
Printer.Canvas.TextOut(X, Y, UTF8ToSys(MeinText));
oder so:
Printer.Canvas.TextOut(X, Y, SysToUTF8(MeinText));

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: TPrinter Unicode Text

Beitrag von RugiaArt »

Windows ja.
Also Utf8ToSys und SysToUTF8 bringen in diesem fall nichts, ausgabe ist jetzt so dass statt Umlaute einfach nichts da ist (Für -> Fr)

mein "Textweg" zum Printer ist folgend:

Memo -> variable (string) -> Printer.canvas.textout(variable)

vor dem Printer hab ich mit ShowMessage getestet und dort waren alle Umlaute da.
Also irgendwie ist es dem Printer banane in welcher Form ich string übergebe... es sei denn es gibt iwie einen haken :)

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: TPrinter Unicode Text

Beitrag von theo »

Bei mir geht das.
Ist denn irgend etwas spezielles mit deinem Drucker oder der Spracheinstellung von Windows?

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: TPrinter Unicode Text

Beitrag von RugiaArt »

Habe jetzt mein Fehler genau lokalisiert:

also wenn ich Direkt einen zusammenhängenden string dem Drucker übergebe dann werden alle Umlaute richtig gedruckt. Wenn ich aber (so wie ich es machen will) jedes zeichen eines strings einzeln dem Drucker gebe dann werden die Umlaute nicht gedruckt:

Code: Alles auswählen

//so werden Umlaute NICHT gedruckt
  Printer.BeginDoc;
  txt := 'Umlaute ÖÄÜ';
  for c:=0 to Length(txt) do
  begin
    Printer.Canvas.TextOut(100*c, 100, txt[c]);
  end;
  Printer.EndDoc;
 
 
//so werden Umlaute gedruckt
  Printer.BeginDoc;
  txt := 'Umlaute ÖÄÜ';
  Printer.Canvas.TextOut(100*c, 100, txt);
  Printer.EndDoc;

So und nu? ich drucke einzelne zeichen weil ich grad die Routine für automatische Zeilenumbrüche programmiere

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: TPrinter Unicode Text

Beitrag von theo »

Das hättest du auch gleich sagen können. :roll:
UTF-8 Umlaute etc. sind Sequenzen. Die kann man nicht Char- bzw Byte-weise abgreifen.
Du kannst dich mal hier schlau machen.
https://de.wikipedia.org/wiki/UTF-8
http://wiki.freepascal.org/LCL_Unicode_Support

Vllt. hilft dir diese Unit: http://www.lazarusforum.de/viewtopic.php?f=29&t=5894

RugiaArt
Beiträge: 41
Registriert: Do 11. Okt 2012, 18:50
OS, Lazarus, FPC: Win7 (L 1.0.0.2 FPC 2.6.0)
CPU-Target: 32Bit
Wohnort: Rügen
Kontaktdaten:

Re: TPrinter Unicode Text

Beitrag von RugiaArt »

Danke es funktioniert! :)

ich habe folgende Units benutzt: unistring, lazutf8
musste aber feststellen dass man jetzt UTF8Length(text) statt einfach Length(text) nutzen muss :) ..ist auch klar..

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: TPrinter Unicode Text

Beitrag von theo »

Du kannst auch length von TUniString verwenden.

Wie im Beispiel auf der Seite http://www.lazarusforum.de/viewtopic.php?f=29&t=5894

Code: Alles auswählen

for i:=1 to s.length do
 

Antworten