[gelöst]ÜÄÖß und UTF8

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

[gelöst]ÜÄÖß und UTF8

Beitrag von heheracer »

Hi,

Ich bin gerade dabei ein Programm zu schreiben, dass Textdateien öffnet und daraus Texte kopiert.
So weit so gut das klappt ja schon ganz gut.

Jetzt dachte ich mir super, aber öäüßÄÖÜ hätte ich schon gerne (weil das geht meines Wissens nicht aus Textdateien, da kommen nur '?' raus).
Gut, mit Lazarus ja sicher kein Problem...

Meine Idee, ich benutze einfach ein # um Umlaute anzukündigen.
Danach soll in einer case Anweisung einfach die Zahl nach dem # umgewandelt werden und dann wird das # rausgenommen.

Kompilierfehler

Code: Alles auswählen

astring[n]:='ä'
darf ich nicht machen

Nachdem ich ein paar Threads durchgelesen habe bin ich ziemlich schnell verstanden, dass UTF8 Strings total anders funktionieren wie ASCI-Strings.

Hab gedacht jetzt geht alles, hat auch kompiliert, hat mich aber rausgeworfen.

Code: Alles auswählen

procedure SpecialChars;
var
  s, n: integer;
  //Form1.pds=widestring
begin
  for n:=1 to length(Form1.pds)-1 do
    if Form1.pds[n]='#' //das geht nicht, UTF8Decode(Form1.pds[n])[1]=UTF8Decode('#')[1] geht auch nicht
    then
      begin
        case Form1.pds[n+1] of
         '0': Form1.pds[n+1]:='#';
         '1': Form1.pds[n+1]:=UTF8Decode('ä')[1];
         '2': Form1.pds[n+1]:=UTF8Decode('ö')[1];
         '3': Form1.pds[n+1]:=UTF8Decode('ü')[1];
         '4': Form1.pds[n+1]:=UTF8Decode('ß')[1];
         '5': Form1.pds[n+1]:=UTF8Decode('Ä')[1];
         '6': Form1.pds[n+1]:=UTF8Decode('Ö')[1];
         '7': Form1.pds[n+1]:=UTF8Decode('Ü')[1];
         else showmessage('Error #4'+slinebreak+'Wrong use of #');
        end;
        setlength(Form1.pds, length(Form1.pds)-1);
        for s:=n to length(Form1.pds)-1 do
          Form1.pds[s]:=Form1.pds[s+1];
      end;
end;
Kann mir jemand helfen?

MfG
Zuletzt geändert von heheracer am Mi 17. Jun 2015, 17:29, insgesamt 1-mal geändert.

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

Re: ÜÄÖß und UTF8

Beitrag von theo »

:?:

Ich verstehe nicht, was das werden soll, deshalb kann ich dir auch keine Antwort geben.
heheracer hat geschrieben: Jetzt dachte ich mir super, aber öäüßÄÖÜ hätte ich schon gerne (weil das geht meines Wissens nicht aus Textdateien, da kommen nur '?' raus).
Wie kommst du denn darauf? Was verstehst du unter "Textdatei"?

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: ÜÄÖß und UTF8

Beitrag von creed steiger »

Was rauskommt haengt immer vom Format deiner Textdatei ab.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: ÜÄÖß und UTF8

Beitrag von heheracer »

Naja, ich kenne nur einen Typ von textifles:

Code: Alles auswählen

var
  tf: textfile;
 
begin
  assignfile(tf, (dateiname));
  reset(tf);
  readln(tf, (string));
Und da kann das schon allein deswegen nicht gehen weil readln keine Umlaute unterstützen dürfte.

Zur funktionsweise:
Ich habe folgenden String(pds): "Das #1ndert nichts an der Lage" daraus soll werden "Das ändert nichts an der Lage"

MfG
Zuletzt geändert von Lori am Mi 17. Jun 2015, 10:04, insgesamt 1-mal geändert.
Grund: Highlighter

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

Re: ÜÄÖß und UTF8

Beitrag von theo »

heheracer hat geschrieben: Und da kann das schon allein deswegen nicht gehen weil readln keine Umlaute unterstützen dürfte.
Nochmal die Frage: Wie kommst du darauf? Das stimmt doch nicht.
Welche Kodierung hat deine Textdatei? (Damit meine ich nicht den Pascal Datentyp "TextFile", sondern das, was in der Datei steht, also UTF-8, UTF-16, ISO 8859 ... )

Warf
Beiträge: 2119
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: ÜÄÖß und UTF8

Beitrag von Warf »

Umlaute werden schon mit dem Ascii Zeichensatz abgebildet. Es reicht völlig einen ansi String zu verwenden. Ausser die Textdatei wurde mit 2 Byte per Zeichen (widestring) abgebildet

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

Re: ÜÄÖß und UTF8

Beitrag von theo »

Warf hat geschrieben:Umlaute werden schon mit dem Ascii Zeichensatz abgebildet. Es reicht völlig einen ansi String zu verwenden. Ausser die Textdatei wurde mit 2 Byte per Zeichen (widestring) abgebildet
Das stimmt alles mMn nicht.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: ÜÄÖß und UTF8

Beitrag von mschnell »

heheracer hat geschrieben:... Textdateien ...
Es gibt keine "Textdatei" (ohne weitere Angaben). Du musst immer wissen, in welchem Code der Text dort abgelegt ist. Erst dann kannst Du die Software so schreiben, dass sie den Inhalt korrekt wqeiter verarbeitet.

-Michael

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

Re: ÜÄÖß und UTF8

Beitrag von wp_xyz »

Kommt noch darauf an, was du mit den Strings machen willst. Um den String z.B. in einem GUI-Programm in einem Memo anzuzeigen, musst du AnsiToUTF8 verwenden, da die LCL UTF8-Codierung verwendet und die Datei wahrscheinlich das Systemencoding hat:

Code: Alles auswählen

 
var
  tf: textfile;
  s: String;
 
begin
  assignfile(tf, (dateiname));
  reset(tf);
  readln(tf, s);
  Memo1.Lines.Add(AnsiToUTF8(s));
 
Generell musst du den Ansi-String von der Codierung, die in der Datei verwendet wird, in die Codierung auf dem Zielgerät umwandeln. Schau dir dazu dir Routinen in LConvEncoding an.

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

Re: ÜÄÖß und UTF8

Beitrag von theo »

wp_xyz hat geschrieben: musst du AnsiToUTF8 verwenden, da die LCL UTF8-Codierung verwendet und die Datei wahrscheinlich das Systemencoding hat:
Da käme es noch auf das Betriebssystem an.
Aber lasst heheracer doch mal antworten. Es bringt ja nichts, ihn jetzt mit Halbwissen zu bombardieren.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: ÜÄÖß und UTF8

Beitrag von heheracer »

Ah ok danke jetzt komme ich der Sache schon näher.

Ich speichere die Dateien im normalen Format unter Windows Editor, also ANSI (glaub ich, bin gerade nicht am pc), damit lassen sich Umlaute auch speichern und laden, nur eben mit readln nicht.
Aber aus verschiedenen Gründen will ich die Dateien nicht besonders speichern.

Umlaute aus der Datei werden als '?' im String gespeichert, ich kann nachher einen Link mit dem Programm hochladen dann könnt ihr es selbst ausprobieren.

Nochmal kurz eine Frage: In Lazarus kann ich doch im Standard string (var s:string;) Umlaute speichern oder? Weil wenn ja muss ich das ja irgendwie gehen.

Werde später AnsiToUTF8 probieren.

MfG

PS: @Warf ASCI kann sicher keine Umlaute

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

Re: ÜÄÖß und UTF8

Beitrag von theo »

heheracer hat geschrieben: Werde später AnsiToUTF8 probieren.
Ja, tu das. Auf Windows wird es so wahrscheinlich klappen. Auf Linux müsste man eine Fkt. aus LConvEncoding nehmen.

heheracer
Beiträge: 54
Registriert: Mo 17. Nov 2014, 16:45

Re: ÜÄÖß und UTF8

Beitrag von heheracer »

AnsiToUTF8 hat super geklappt, danke.

MfG

Antworten