Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Stringbearbeitung - UTF8-Zeichensatz (https://www.delphipraxis.net/180357-stringbearbeitung-utf8-zeichensatz.html)

Konstantin H. 14. Mai 2014 12:36

Stringbearbeitung - UTF8-Zeichensatz
 
Hallo DP,

ich habe folgende Probleme.

1. Ein String(ohne Leerzeichen und Zeilenumbrüche) beteht aus Ziffern und Buchstaben, die teilweise HEX-Zahlen darstellen. Es ist bekannt an welcher Position die richtige Inforamtion abgelegt ist und mittels
Delphi-Quellcode:
copy(string, 10,10)
werden die einzelnen stringteile rauskopiert und in die string-Variablen abgelegt. Danach muss dieser String in HEX-Zahlen unterteilt werden(die HEX-Zahlen sind jeweils zweistellig) und der entstandene HEX-String mit UTF-8-Zeichensatz umgewandelt werden. Die länge des HEX-strings ist immer bekannt.

z.B:
string-variable: 48415553
string in 2-stellige HEX-Zahlen umgestellt: 48 41 55 53
string decodiert: HAUS

Zur dekodierung habe ich die funktion von Lemmy1 aus diesem Thread verwendet, und die funktioniert. Ich muss den String in zweistellige HEX-Zahlen unterteilen.

folgendes funktioniert nicht, E2010 (string and procedure, untyped pointer or untyped parameter)und E2081(assignment FOR-Loop variable 'i')

Delphi-Quellcode:
stelle := Copy(gesamt_text,24,30);
for i:= 2 to 8 do
 begin
  stelle := Insert(' ', stelle, i);
  i := i+3;
 end;

2. Es ist bekannt, dass im string, der zB. 120 Zeichen lang ist, Information befindet. Diese ist von Nullen umgeben, die muss man löschen. Das ist kein Problem, jedoch befinden sich da die HEX-Zahlen, wie zB 31 00 11, die nicht benötigt werden. Die stehen vor der eigentlicher Information.

zB: z.B:
string-variable: 00000011ED484155530000
string in 2-stellige HEX-Zahlen umgestellt: 48 41 55 53
string decodiert: HAUS

Könnt ihr mir vllt weiterhelfen?

MfG Konstantin

himitsu 14. Mai 2014 12:43

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Delphi-Referenz durchsuchenInsert

Tipp: Schau mal auf den nicht vorhandenen Result-Typ.


Und das "i := i+3;" : Man darf in einer For-Schleife die Schleifenvariable nicht verändern.
Entweder du rechnest das überall direkt hoch (
Delphi-Quellcode:
for i := 0 to 3 do Irgendwas(i*3);
), oder du mußt das z.B. als While-Schleife lösen.

DeddyH 14. Mai 2014 12:46

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Delphi-Quellcode:
Stelle := {System.}Insert(...)
kann nicht funktionieren, da Insert eine Prozedur ist. Zum Rest: :gruebel:, was ist eigentlich das Problem? Du hast einen String, der vorne und hinten aus "0" besteht und in dem sich zwischen diesen Informationen befinden, die Du benötigst, soweit richtig? Filtert man die führenden und abschließenden "0" weg, enthält der resultierende String immer noch irrelevante Stellen, auch richtig? Und diese willst Du nun auch beseitigen und den verbleibenden String codieren, stimmt' s?

Konstantin H. 14. Mai 2014 13:02

AW: Stringbearbeitung - UTF8-Zeichensatz
 
@himitsu
Danke, mit while geht es genauso gut. Ich werde wohl diese Schleifenart nehmen.

Das Problem der Aufteilung des strings in HEX-Zahlen besteht aber noch. Ich verstehe nicht ganz, was der Result liefern soll...

@DeddyH
Ja, genau das möchte ich.
Mit
Delphi-Quellcode:
StringReplace(stelle, '00','',[rfReplaceAll]);
beseitige ich die Nullen. Ich brauche nur die HEX, die Buchstaben, Zahlen und Leerzeichen darstellen aus dieser Tabelle, d.h. der Rest kann beseiting werden. Ich komme aber nich auf eine elegante Lösung.

Sir Rufo 14. Mai 2014 13:09

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Mit
Delphi-Quellcode:
StrToInt( '$FF' )
bekommt man
Delphi-Quellcode:
255
(in Hex
Delphi-Quellcode:
$FF
) als Integer zurück.

Hilft dir das weiter ;)

himitsu 14. Mai 2014 13:21

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Zitat:

Delphi-Quellcode:
StringReplace(stelle, '00','',[rfReplaceAll]);

F00F = FF :stupid:


StrToInt geht ja nur bis maximal 8 Byte am Stück (Int64) ... für mehr muß man es zerlegen oder man verwendet z.B. HexToBin. (IntToHex/Format / BinToHex)

Konstantin H. 14. Mai 2014 13:24

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Zitat:

Zitat von Sir Rufo (Beitrag 1258882)
Mit
Delphi-Quellcode:
StrToInt( '$FF' )
bekommt man
Delphi-Quellcode:
255
(in Hex
Delphi-Quellcode:
$FF
) als Integer zurück.

Hilft dir das weiter ;)

Leider nicht, es sind hauptsächlich Buchstaben und HEX-String muss zuerst zerteilt werden. FFFF und FF FF sind unterschiedliche werte ;)

DeddyH 14. Mai 2014 13:24

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Nicht unbedingt die performanteste Lösung, als Ansatz soll es aber erst einmal reichen:
Delphi-Quellcode:
function Irgendwas(const s: string): string;
var
  i, iCharCode: integer;
  CharPair: string;
begin
  Result := '';
  i := 1;
  while i < Length(s) - 1 do
    begin
      CharPair := Copy(s, i, 2);
      if TryStrToInt('$' + CharPair, iCharCode) then
        if (iCharCode >= Ord('A')) and (iCharCode <= Ord('Z')) then
          Result := Result + Chr(iCharCode);
      inc(i, 2);
    end;
end;

Konstantin H. 14. Mai 2014 13:27

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Zitat:

Zitat von himitsu (Beitrag 1258884)
Zitat:

Delphi-Quellcode:
StringReplace(stelle, '00','',[rfReplaceAll]);

F00F = FF :stupid:


StrToInt geht ja nur bis maximal 8 Byte am Stück (Int64) ... für mehr muß man es zerlegen oder man verwendet z.B. HexToBin. (IntToHex/Format / BinToHex)

Ich arbeit mit dem Zeichensatz aus dieser Tabelle, da sind solche Kreuzungen nicht wirklich möglich ;)

himitsu 14. Mai 2014 13:35

AW: Stringbearbeitung - UTF8-Zeichensatz
 
Mit HexToBin in einen UTF8String kopieren.

Oder in ein TBytes und dann via TEncoding in den Unicode-String. (ab Delphi 2009)



Aber warum eigentlich UTF8, wenn dort sowieso nur Latin1 (ISO 8859-1) drin steckt?



Zitat:

Zitat von Konstantin H. (Beitrag 1258888)
Ich arbeit mit dem Zeichensatz aus dieser Tabelle, da sind solche Kreuzungen nicht wirklich möglich ;)

:angel:
Code:
...0
0...

...300D0A30...
wird zu
Delphi-Quellcode:
...3D0A30...

...=
0...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz