Codierung von Strings

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
ThorsteinB
Beiträge: 5
Registriert: Di 25. Jan 2011, 11:17

Codierung von Strings

Beitrag von ThorsteinB »

Hallo,

obwohl ich im Programmieren noch sehr unerfahren bin habe ich mir ein ehrgeiziges Ziel gesetzt und möchte gerne folgendes Problem mit Lazarus lösen:

Ich habe eine Textdatei mit ca. 10000 Wörtern die in ISO-8859-15 kodiert ist. Aus dieser Liste möchte ich einzelne Wörter herausnehmen und einem externen Shell-Script als Parameter übergeben. Dieses Shell-Script erwartet den übergebenen String kodiert in ISO-8859-15. Mein System ist allerdings für UTF-8 konfiguriert.

Nun bin ich nach langem Überlegen ehrlich gesagt etwas ratlos. Hat von Euch jemand eine Idee wie ich das angehen könnte?


Freundliche Grüße,
Max

P.S.: Das Shell-Script ist eine Art wrapper für ein Perl Interface (Lingua::DE::Wortschatz) zu einer Datenbank der Uni Leipzig.

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

Re: Codierung von Strings

Beitrag von theo »

Normalerweise kannst du mit der Unit LConvEncoding Codierungen umwandeln.

Also etwa so:

s:=ConvertEncoding(s,'ISO_8859-15',EncodingUTF8);

... und umgekehrt.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Codierung von Strings

Beitrag von pluto »

@Theo das sollte so heißen: ConvertEncoding(s,'iso88591',EncodingUTF8)
Damit läuft es Prima. Danke für den Tipp.
(Auch wenn es nicht meine Frage war, aber genau das gleiche Problem hatte ich auch seit Tagen).
MFG
Michael Springwald

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Codierung von Strings

Beitrag von MAC »

die wörter bekommt man ja einfach raus in dem man den text nach leerzeichen absucht, ein word ist immer durch 2 gekennzeichnet.
Außer am anfang und Ende einer Zeile...

Code: Alles auswählen

Signatur := nil;

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

Re: Codierung von Strings

Beitrag von theo »

pluto hat geschrieben:@Theo das sollte so heißen: ConvertEncoding(s,'iso88591',EncodingUTF8)
Ja, Ich hatte einen Tippfehler beim Unterstrich (und nicht getestet).

Aber das geht beides:

s:=chr($A4);
s:=ConvertEncoding(s,'ISO-8859-15',EncodingUTF8);
oder
s:=ConvertEncoding(s,'iso885915',EncodingUTF8);
Caption:=s;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Codierung von Strings

Beitrag von Socke »

ThorsteinB hat geschrieben:Ich habe eine Textdatei mit ca. 10000 Wörtern die in ISO-8859-15 kodiert ist. Aus dieser Liste möchte ich einzelne Wörter herausnehmen und einem externen Shell-Script als Parameter übergeben. Dieses Shell-Script erwartet den übergebenen String kodiert in ISO-8859-15. Mein System ist allerdings für UTF-8 konfiguriert.
Brauchst du da nicht nur den Pfad zum Shell-Script in UTF-8 kodiert vorzuhalten? Die Parameter werden doch so übergeben wie sie ankommen...
Für das Betriebssystem ist es doch irrelevant, ob ein Parameter in ISO-8859-15 oder UTF-8 kodiert ist, nur die Darstellung durch die einzelnen Komponenten (Editor der Textdatei, Konsole in der das Script aufgerufen wird, etc.) variiert je nach Annahme des Zeichensatzes.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

ThorsteinB
Beiträge: 5
Registriert: Di 25. Jan 2011, 11:17

Re: Codierung von Strings

Beitrag von ThorsteinB »

Erstmal herzlichen Dank für die Antworten von theo, pluto und MAC!

Leider hab ich das zunächst nicht hinbekommen und war dann ungeduldig mit einer Lösung. Dazu habe ich mir dann eine Art "workaround" zusammen geschustert der zwar unnötig Rechenzyklen verbraucht, aber bestens funktioniert:

Code: Alles auswählen

var
  F: TextFile;
  AProcess: TProcess;
 
begin
  AssignFile(F,'temp.sh');
  Rewrite(F);
  writeln(F,'#!/bin/bash');
  writeln(F,'export LANG="de_DE.ISO-8859-15@euro"');
  writeln(F,'rm baseform.txt');
  writeln(F,'perl ws Baseform '+Edit1.Text+' | tail -n +5 > temp1');
  writeln(F,'iconv -f ISO-8859-15 -t UTF-8 -o baseform.txt temp1');
  writeln(F,'rm temp1');
  CloseFile(F);
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'iconv -t ISO-8859-15 -o script.sh temp.sh';
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  AProcess.Free;
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := 'sh script.sh';
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  AProcess.Free;
  AssignFile(F,'baseform.txt');
  Reset(F);
  while not EOF(F) do begin
    readln(F,Line1);
    Edit2.Text := Line1;
  end;
  CloseFile(F);
end;
Und Socke, auch Dir ein Dankeschön. Du meinst das ganze müßte auch dann funktionieren, wenn ich sowohl mein temp.sh und script.sh als auch den ganzen Code durch folgendes ersetze?

Code: Alles auswählen

var
  F: TextFile;
  Cmd: String;
  AProcess: TProcess;
 
begin
  Cmd:= 'perl ws Baseform '+Edit1.Text+' | tail -n +5 > baseform.txt';
  AProcess := TProcess.Create(nil);
  AProcess.CommandLine := ConvertEncoding(Cmd,EncodingUTF8,'ISO-8859-15');
  AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];
  AProcess.Execute;
  AProcess.Free;
  AssignFile(F,'baseform.txt');
  Reset(F);
  while not EOF(F) do begin
    readln(F,Line1);
    Line1:= ConvertEncoding(Line1,'ISO-8859-15',EncodingUTF8);
    Edit2.Text:= Line1;
  end;
  CloseFile(F);
end;
Nur leider funktioniert das im Moment nicht. Ich speichere es mal als Knobelaufgabe für später ... :-)

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Codierung von Strings

Beitrag von marcov »

Socke hat geschrieben:
ThorsteinB hat geschrieben:Ich habe eine Textdatei mit ca. 10000 Wörtern die in ISO-8859-15 kodiert ist. Aus dieser Liste möchte ich einzelne Wörter herausnehmen und einem externen Shell-Script als Parameter übergeben. Dieses Shell-Script erwartet den übergebenen String kodiert in ISO-8859-15. Mein System ist allerdings für UTF-8 konfiguriert.
Brauchst du da nicht nur den Pfad zum Shell-Script in UTF-8 kodiert vorzuhalten? Die Parameter werden doch so übergeben wie sie ankommen...
Für das Betriebssystem ist es doch irrelevant, ob ein Parameter in ISO-8859-15 oder UTF-8 kodiert ist, nur die Darstellung durch die einzelnen Komponenten (Editor der Textdatei, Konsole in der das Script aufgerufen wird, etc.) variiert je nach Annahme des Zeichensatzes.
Für das Betriebssystem macht nur der Bytestream aus. Aber denselben Zeichenkette kann anders sein zwischen UTF-8 und ISO-8859-15

Antworten