Hallo Leute,
Ich hab nun schon einen Tag gesucht. Auch vieles gefunden. Nur die Lösung nicht.
Wir haben hier ein eigenartiges Projekt auf welches ich auch nicht eingehen möchte.
Tatsache ist:
- Es läuft noch auf D2007
- Es werden keine
VCL Komponenten verwendet.
Gegeben sind diverse UTF8 codierte Felder in einer
MySql Datenbank.
Nun steht da z.b. drin: d180d183d181d181d0bad0b8d0b920d18fd0b7d18bd0ba
Ich lese dies via Devart
Query aus.
Nun kommt das spannende: Ich muss diesen "parsen" und das Ergebnis in ein anderes Feld schreiben:
русский язык (= russische Sprache von
hier)
Den umgekehrten Weg habe ich in einem Testprojekt.
Das .pas als UTF8 gespeichert mit einer Konstante:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
s,r: WideString;
begin
// s:= 'русский язык';
s := 'р'; // erstes Zeichen aus obigem String
r := UTF8ToHexStr(s); // r --> D180
end;
function UTF8ToHexStr(source : WideString) : WideString;
var
i: Integer;
ss : TStringStream;
buffer : Array[0..128] of Byte;
begin
Result := '';
ss := TStringStream.Create(UTF8Encode(source));
Try
ss.Position := 0;
ss.Read(buffer, ss.Size);
for i := 0 to ss.Size - 1 do
Result := Result + intToHex(buffer[i], 2);
Finally
ss.Free;
End;
end;
An dem Versuch z.b. dieses wieder in einen Widestring bringen bin ich gescheitert.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
s: WideString;
begin
s:= HexStrToUTF8('
D180');
end;
function HexStrToUTF8(HexString:
String): WideString;
var
i,x , Size, Pos: Integer;
begin
Result:= '
';
Pos:= 0;
Size:= Length(HexString);
while Pos < Size
do
begin
x:= StrToInt('
$'+copy(HexString,Pos,4));
// zwischenvariable hier habe ich den korrekten Dec Wert 53632 welcher HEX D180 entspricht.
// für 1 Byte wäre jetzt einfach die Funktion Chr(x) anzuwenden.
// Result:= Result + Chr(StrToInt('$'+copy(HexString,Pos,4)));
// Was zum Geier muss ich in diesem Fall tun unten einige hilflose Versuche?
// Result : WideChar(x);
// x:= MultiByteToWideChar(CP_UTF8,MB_PRECOMPOSED,'',StrToInt('$'+copy(HexString,Pos,4)),nil,0);
// x:= MultiByteToWideChar(CP_UTF8,MB_PRECOMPOSED,PChar('$'+copy(HexString,Pos,4)),-1,nil,0);
// Result:= Result + Chr(MultiByteToWideChar(CP_UTF8,MB_PRECOMPOSED,'',StrToInt('$'+copy(HexString,Pos,4)),nil,0));
Inc(Pos,4);
end;
end;
Danke für jede Hilfe
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.