![]() |
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:
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.
copy(string, 10,10)
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 ![]() 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 |
AW: Stringbearbeitung - UTF8-Zeichensatz
![]() 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:
), oder du mußt das z.B. als While-Schleife lösen.
for i := 0 to 3 do Irgendwas(i*3);
|
AW: Stringbearbeitung - UTF8-Zeichensatz
Delphi-Quellcode:
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?
Stelle := {System.}Insert(...)
|
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:
beseitige ich die Nullen. Ich brauche nur die HEX, die Buchstaben, Zahlen und Leerzeichen darstellen aus dieser
StringReplace(stelle, '00','',[rfReplaceAll]);
![]() |
AW: Stringbearbeitung - UTF8-Zeichensatz
Mit
Delphi-Quellcode:
bekommt man
StrToInt( '$FF' )
Delphi-Quellcode:
(in Hex
255
Delphi-Quellcode:
) als Integer zurück.
$FF
Hilft dir das weiter ;) |
AW: Stringbearbeitung - UTF8-Zeichensatz
Zitat:
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) |
AW: Stringbearbeitung - UTF8-Zeichensatz
Zitat:
|
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; |
AW: Stringbearbeitung - UTF8-Zeichensatz
Zitat:
![]() |
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:
Code:
wird zu
...0
0... ...300D0A30...
Delphi-Quellcode:
...3D0A30...
...= 0... |
AW: Stringbearbeitung - UTF8-Zeichensatz
Zitat:
|
AW: Stringbearbeitung - UTF8-Zeichensatz
Wenn ich das mal zusammen fassen darf:
Du hast einen String in dem nur die Zeichen 0..9,A..F auftreten. Sie sind eine hexadezimale Darstellung von Zeichen in UTF8-Codierung. (C39F='ß') die Nutzdaten sind von bestimmten Zeichenfolgen begrenzt. die Nutzdaten sollen im Klartext dargestellt werden / die nutzdaten sollen schön dargestellt werden. Ist das soweit richtig? Gruß K-H |
AW: Stringbearbeitung - UTF8-Zeichensatz
Also ich habe das problem der Zerteilung in HEX-Zahlen ziemlich brutal gelöst.
Delphi-Quellcode:
Ich muss leider zugeben, dass ich eine ziemliche Niete bin, was komplexere Funktionen angeht. Darum versuche ich mich auf etwas einfachere funktionen zu beschränken.stelle := Copy(gesamt_text,73,52); stelle_HEX := ''; z := 52; i := 1; while i <= 26 do begin stelle_HEX := stelle_HEX + Copy(stelle, 1, 2) + ' '; z := z - 2; stelle := Copy(stelle, 3, z); i := i + 1; end; @himitsu Da ich nur mit Zahlen und Buchstaben(auch leerzeichen) arbeite, kommt es nicht zu solchen Kollisionen :thumb: @DeddyH Ich versuche jetzt erstma deinen Code zu verstehen :oops: |
AW: Stringbearbeitung - UTF8-Zeichensatz
Zitat:
|
AW: Stringbearbeitung - UTF8-Zeichensatz
Delphi-Quellcode:
var S: UTF8String;
SetLength(S, Length(gesamt_text) div 2) HexToBin(PChar(gesamt_text), PAnsiChar(S), Length(S)); ShowMessage(Trim(S)); // ShowMessage(Trim(UTF8ToString(S))); falls noch keine funktionierende automatische String-Konvertierung existiert |
AW: Stringbearbeitung - UTF8-Zeichensatz
@himitsu
wenn ich richtig verstehe, macht dein code folgendes: 1. Die Länge des UTF8-Strings wird auf Hälfte des Ursprungstexts festgelegt 2. Mit HexToBin konvertierst du die hex-zahlen, die du durch die beiden pointer festlegst 3. Mit Trim werden der Anfang und das Ende "gesäubert" und mit showmessage ausgegeben Das ist leider nicht nützlich für mich, da ich die nicht benötigten Hex-zahlen ausfiltern muss. Und die eigentliche Konvertierung habe ich bereits realisiert. Zerteilung des strings:
Delphi-Quellcode:
Konvertierung von Hex zu Stringstelle := Copy(gesamt_text,73,52); stelle_HEX := ''; z := length(stelle); while z > 0 do begin stelle_HEX := stelle_HEX + Copy(stelle, 1, 2) + ' '; z := z - 2; stelle := Copy(stelle, 3, z); end;
Delphi-Quellcode:
Ich suche erstmal nach der Lösung weiter.
function HexStrToStr(s: string) : string;
var s2 : string; begin Result := ''; while s <> '' do begin if Pos(' ', s) <> 0 then begin s2 := Copy(s, 1, Pos(' ', s)-1); s := Copy(s, Length(s2)+2, MaxInt); end else begin s2 := s; s := ''; end; Result := Result + Chr(StrToInt('$' + s2)); end; end; |
AW: Stringbearbeitung - UTF8-Zeichensatz
Also letztendlich habe ich alles beendet. Funktioniert auch alles. :coder:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz