[gelöst] Utf8ToAnsi unter Linux funktioniert nicht immer

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 170
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Lazarus 3.8 FPC 3.2.2 x86_64-win64-win32/win64 x86_64-linux-gtk2
CPU-Target: i386, win64, arm

[gelöst] Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von willi4willi »

Hallo,

ich habe ein Problem beim Umwandeln eines Strings von utf8 zu Ansi in einer normale Anwendung unter Linux.
Die Funktion utf8toansi wird einfach ignoriert.
Das gleiche unter Windows funktioniert. Auch eine Konsole-Anwendung funktioniert sowohl unter Window als auch unter Linux.

Getestet habe ich das so:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var a : String;
    b : String;
    i : integer;
begin
  a:='Ärger';
  b:=utf8toansi(a);
  for i:=1 to length(a) do memo1.Lines.Add(inttostr(ord(a[i])));
  memo1.Lines.Add('-----');
  for i:=1 to length(b) do memo1.Lines.Add(inttostr(ord(b[i])));
end;
 
(funktioniert nur unter Windows)

bzw.

Code: Alles auswählen

 
  a:='Ärger';
  b:=utf8toAnsi(a);
  for i:=1 to length(a) do writeln(ord(a[i]));
  writeln('-------');
  for i:=1 to length(b) do writeln(ord(b[i]));
 
  readln;
 
(funktioniert sowohl unter Windows als auch unter Linux)

Ich verwende Lazarus 1.2.6 und FPC 2.6.4

Ist das bei Euch auch so? Hat jemand eine Erklärung?
Zuletzt geändert von willi4willi am Sa 6. Jun 2015, 13:45, insgesamt 1-mal geändert.
 

Viele Grüße

Willi4Willi

------------

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

Re: Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von theo »

Zuerst immer die Frage: Wozu?
Man kann eigentlich nicht UTF8 (Unicode) nach "Ansi" umwandeln, höchstens einen Teil von UTF-8 in eine bestimmte 8bit Codepage.
Also was ist der Zweck?

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 170
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Lazarus 3.8 FPC 3.2.2 x86_64-win64-win32/win64 x86_64-linux-gtk2
CPU-Target: i386, win64, arm

Re: Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von willi4willi »

theo hat geschrieben:Zuerst immer die Frage: Wozu?
Ich benötige das für einen Thermo-Drucker, der an einer Seriellen Schnittstelle hängt. Dazu wird eine Datei (utf8) in eine Stringlist geladen und dann Zeile für Zeile gedruckt.
Der Druckerzeichensatz ist ISO-8859-1. Wenn er Umlaute als Ansi bekommt, ist er zufrieden.
theo hat geschrieben:Man kann eigentlich nicht UTF8 (Unicode) nach "Ansi" umwandeln, höchstens einen Teil von UTF-8 in eine bestimmte 8bit Codepage.
Ich dachte, dass man mit der Funktion Utf8ToAnsi einen String, der UTF-8 codiert ist, in einen Ansi-String wandeln kann. Natürlich werden nur die Zeichen gewandelt, die mit zwei Byte daherkommen, wie z.B. die Umlaute (oder in meinem Fall auch das € -Zeichen).

Das funktioniert auch unter Windows und unter Linux. Aber bei Linux nur in einer Consoleanwendung. Wenn ich die Funktion in einer normalen Anwendung, also mit Forms, verwende, dann geht das nicht. Es wird wieder ein UTF-8 String zurückgegeben.
Wie gesagt, ich habe den gleichen Quelltext auf unterschiedlichen Plattformen compilliert.
 

Viele Grüße

Willi4Willi

------------

wp_xyz
Beiträge: 5159
Registriert: Fr 8. Apr 2011, 09:01

Re: Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von wp_xyz »

willi4willi hat geschrieben:Der Druckerzeichensatz ist ISO-8859-1.
Da kennst du ja die Codepage. Nimm "UTF8ToISO_8859_1" aus lconvencoding. UTF8ToAnsi konvertiert in die aktuell geladene CodePage. Das funktioniert nicht unter Linux, weil Linux mit UTF8 arbeitet, also gar keine CodePages benötigt.

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

Re: Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von theo »

LConvEncoding wie, wp_xyz sagt.
Für das Euro Zeichen brauchst du aber afaik ISO 8859-15. Also
LConvEncoding.UTF8ToISO_8859_15

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 170
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Lazarus 3.8 FPC 3.2.2 x86_64-win64-win32/win64 x86_64-linux-gtk2
CPU-Target: i386, win64, arm

Re: Utf8ToAnsi unter Linux funktioniert nicht immer

Beitrag von willi4willi »

Super! Es hat geklappt!

vielen Dank euch beiden.

Auch UTF8ToISO_8859_15 für das € zu verwenden, war ein toller Tipp. Laut Drucker-Beschreibung ist zwar das Zeichen in der Codetabelle, aber die wurde von Hersteller scheinbar angepasst.
 

Viele Grüße

Willi4Willi

------------

Antworten