Einzelnen Beitrag anzeigen

taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#1

UTF8 Widestring aus 2Byte Hexcode D2007

  Alt 12. Jan 2012, 08:44
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.
  Mit Zitat antworten Zitat