Seltsamer Effekt beim Addieren von Zeichenketten [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Seltsamer Effekt beim Addieren von Zeichenketten [gelöst]

Beitrag von AlterMann »

Hallo

Ich hab eine kleine Funktion geschrieben, die mir in einer Zeichenkette alle Umlaute durch ihre Äquivalente mit zwei Buchstaben (z.B.: ä = ae) ersetzen soll.
Merkwürdigerweise gibt mir die Routine immer nur eine leere Zeichenkette zurück.

Ein Breakpoint in der Zeile zs := zs + zwch; mit Überwachung von zs und zwch zeigt, das zwch immer das jeweilige Zeichen aus dem String s enthält, aber zs bleibt stets leer.

Ersetze ich

Code: Alles auswählen

zs := zs + zwch;
durch

Code: Alles auswählen

zs := zs + 'x';
wird zs bei jedem Schleifendurchlauf um ein 'x' länger ... :shock:

Code: Alles auswählen

 function UmlauteWeg(s:string):string;

   var zs, zwch : string;
       a : longint;

  begin
   zs := '';
   for a := 0 to length(s) do
    begin
     zwch := s[a];
     if s[a] = 'Ä' then zwch := 'AE';
     if s[a] = 'Ö' then zwch := 'OE';
     if s[a] = 'Ü' then zwch := 'UE';
     if s[a] = 'ä' then zwch := 'ae';
     if s[a] = 'ö' then zwch := 'oe';
     if s[a] = 'ü' then zwch := 'ue';
     if s[a] = 'ß' then zwch := 'ss';
     zs := zs + zwch;
    end;
   Result := zs
  end;

Ich hoffe ich übersehe nur irgendetwas völlig Idiotisches, aber könnte das einmal jemand erklären, bitte.
Ich zweifle schon einigermaßen an mir :oops:

Schönen Nachmittag
Christian
Zuletzt geändert von AlterMann am So 28. Feb 2021, 17:37, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

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

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von theo »

Du gehst davon aus, dass ein Char (Byte) ein Zeichen darstellt.
Das ist aber unter UTF-8 nicht so.
Umlaute bestehen z.B. aus 2 Chars.
Darum geht das nicht.

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von AlterMann »

Hallo Theo

Aber in meinem Fall habe ich als erstes ein Wort ohne Umlaute erwischt (Ist ja nur für den Fall, dass ein Namen welche enthält gedacht), und in war auch immer der jeweilige, aktuelle Buchstabe des Namens enthalten.

Dennoch hat sich zs nie verändert.
Das verstehe ich nicht, UTF8 hin oder her ...
Früher war alles besser. Und aus Holz!

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

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von theo »

Achso, Strings beginnen bei 1 nicht bei 0.
War schon immer so.

Code: Alles auswählen

for a := 1 to length(s) do
Für dein eigentliches Anliegen kannst du meinen alten TUniString ausprobieren.
http://www.theo.ch/lazarus/unistring.pas

Das ginge dann etwa so:

Code: Alles auswählen

uses .... unistring;         
....
var s:TUniString;
    s1:String;
  i:integer;  
begin
   s:='öäü lorem ipsum öäü';
   for i:=1 to s.length do
    case s[i] of
      'ö': s1:=s1+'oe';
      'ä': s1:=s1+'ae';
      'ü': s1:=s1+'ue';
    else
      s1:=s1+s[i];
    end;
   Memo1.Text:=s1;
end;  

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von AlterMann »

Danke Theo

Das war's ganz genau.
Wusste doch, dass ich nur (wieder einmal) eine Kleinigkeit übersehe :mrgreen:

Deine unit werde ich gerne verwenden.

Schönen Abend
Christian
Früher war alles besser. Und aus Holz!

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

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von wp_xyz »

theo hat geschrieben:
So 28. Feb 2021, 17:14
Für dein eigentliches Anliegen kannst du meinen alten TUniString ausprobieren.
http://www.theo.ch/lazarus/unistring.pas
Ohne theos eigene Entwicklungen herabwürdigen zu wollen, sowas ähnlich gibt es seit einiger Zeit in der Unit LazUnicode:

Code: Alles auswählen

uses
  LazUnicode;
  
function UmlauteWeg(s:string):string;
var 
  ch: String;  // Wichtig: das muss ein String sein, kein Char, wegen UTF8.
begin
  Result := '';
  for ch in s do
    case ch of
      'Ä': Result := Result + 'Ae';
      'Ö': Result := Result + 'Oe';
      'Ü': Result := Result + 'Ue';
      'ä': Result := Result + 'ae';
      'ö': Result := Result + 'oe';
      'ü': Result := Result + 'ue';
      'ß': Result := Result + 'ss';
      else Result := Result + ch;
    end;
end;

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

Re: Seltsamer Effekt beim Addieren von Zeichenketten

Beitrag von theo »

wp_xyz hat geschrieben:
So 28. Feb 2021, 18:45
Ohne theos eigene Entwicklungen herabwürdigen zu wollen, sowas ähnlich gibt es seit einiger Zeit in der Unit LazUnicode:
Kein Problem.
Damals gab es das noch nicht.
TUniString ist 4 bis 5 Jahre älter als LazUnicode.
Ist wohl auch nicht ganz das Gleiche, aber für diesen Fall geht das "for..in" mit LazUnicode wohl auch.

BeniBela
Beiträge: 308
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Seltsamer Effekt beim Addieren von Zeichenketten [gelöst]

Beitrag von BeniBela »

Dann gibt es auch meine bbutils

Damit läuft das ganze fast zehnmal so schnell:

Code: Alles auswählen

function UmlauteWeg(s:string):string;
var
  sb: TStrBuilder;
  ch: Integer;
begin
  Result := '';
  sb.init(@result);
  with sb do
  for ch in s.enumerateUtf8CodePoints do
    case ch of
      $c4: sb.append('Ae');
      $d6: sb.append('Oe');
      $dc: sb.append('Ue');
      $e4: sb.append('ae');
      $f6: sb.append('oe');
      $fc: sb.append('ue');
      $df: sb.append('ss');
      else sb.appendCodePoint(ch);
    end;
  sb.final;
end;                    

Antworten