Stimmen aus RawByteString string nicht automatisch aufrufen UTF8Decode?

Ich soll zum speichern von beliebigen binären Daten als BLOB in einer SQlite-Datenbank.

Den Daten Hinzugefügt werden, wie value mit dieser Funktion:

procedure TSQLiteDatabase.AddParamText(name: string; value: string);

Ich jetzt konvertieren wollen WideString in seine UTF-8-Darstellung, so kann es auch in der Datenbank gespeichert. Nach dem Aufruf UTF8Encode und speichern das Ergebnis in der Datenbank habe ich festgestellt, dass die Daten innerhalb der Datenbank ist nicht UTF8 decodiert werden. Vielmehr ist es codiert, wie AnsiString in meinem computer das Gebietsschema.

Lief ich folgenden test, um zu überprüfen, was passiert ist:

type
  {$IFDEF Unicode}
  TBinary = RawByteString;
  {$ELSE}
  TBinary = AnsiString;
  {$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);
var
  original: WideString;
  blob: TBinary;
begin
  original := 'ä';
  blob     := UTF8Encode(original);

  // Delphi 6:   ä (as expected)
  // Delphi XE4: ä  (unexpected! How did it do an automatic UTF8Decode???)
  ShowMessage(blob);
end;

Nachdem das Zeichen "ä" hat, wurde in UTF8, dass die Daten korrekt in den Speicher ("ä"), jedoch, sobald ich den pass der TBinary Wert an eine Funktion (als string oder AnsiString), Delphi XE4 hat eine "Magische festgelegten" Aufruf von UTF8Decode aus irgendeinem Grund ich weiß es nicht.

Ich habe bereits einen workaround gefunden, dies zu vermeiden:

function RealUTF8Encode(AInput: WideString): TBinary;
var
  tmp: TBinary;
begin
  tmp := UTF8Encode(AInput);
  SetLength(result, Length(tmp));
  CopyMemory(@result[1], @tmp[1], Length(tmp));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  original: WideString;
  blob: TBinary;
begin
  original := 'ä';
  blob     := RealUTF8Encode(original);

  // Delphi 6:   ä (as expected)
  // Delphi XE4: ä (as expected)
  ShowMessage(blob);
end;

Jedoch, diese Problemumgehung mit RealUTF8Encode schmutzig aussieht auf mich und ich würde gerne verstehen, warum ein einfacher Aufruf von UTF8Encode hat nicht funktioniert, und wenn es eine bessere Lösung.

Schreibe einen Kommentar