Einzelnen Beitrag anzeigen

amigage

Registriert seit: 11. Nov 2005
Ort: Leipzig
274 Beiträge
 
Delphi 12 Athens
 
#1

Delphi und PHP: JSON und deutsche Umlaute

  Alt 6. Mär 2021, 15:20
Hallo,

ich möchte in Delphi eine JSON-Datei erstellen und diese dann von php auslesen lassen.
Mein Problem ist, dass entweder die deutschen Umlaute nicht korrekt geschrieben werden, oder php die UTF8-kodierte Datei nicht lesen möchte.

Hier sind meine Quelltexte:

Delphi-Quellcode:
function ExportJSONData : Boolean;
var
  Writer: TJsonTextWriter;
  FileStream: TFileStream;
  StreamWriter: TStreamWriter;
  i: Integer;
  JsonFilename: string;
const
  cJSONFilename = "FSOExport.json";
begin
  log.d('ExportJSONData');
  Result := true;
  
  JsonFilename := System.IOUtils.TPath.Combine(System.SysUtils.IncludeTrailingPathDelimiter(System.IOUtils.TPath.GetSharedDocumentsPath), cJSONFilename);
  log.d(JsonFilename);
  FileStream := TFileStream.Create(JsonFilename, fmCreate);

  StreamWriter := TStreamWriter.Create(FileStream); //, TEncoding.UTF8);
  Writer := TJSONTextWriter.Create(StreamWriter);
  try // finally

    Writer.Formatting := TJSONFormatting.Indented;

    try //except
      Writer.WriteStartObject;

        Writer.WritePropertyName('section');
        Writer.WriteStartArray;
        
        for i := 0 to EntryList.Count - 1 do
        begin
          Writer.WriteStartObject;
          
            Writer.WritePropertyName('name');
            Writer.WriteValue(TMyEntry(EntryList.Items[i]).Name);

            // ....
        
            Writer.WritePropertyName('notes');
            Writer.WriteValue(TMyEntry(EntryList.Items[i]).Notes);

          Writer.WriteEndObject;
        end;
        Writer.WriteEndArray;
     
      Writer.WriteEndObject;
        
    except
      Result := false;
    end;

  finally
    FileStream.Free;
    StreamWriter.Free;
    Writer.Free;
  end;

end;
Hier wird z.B. aus einem ü ein ü und aus ß ein ß
Mein PHP-Skript sieht folgendermaßen aus und gibt die Daten mit den fehlerhaften Umlauten aus.

Code:
<?php
function output($string){
    echo '<p>' . $string;
}
if (!file_exists("FSOExport.json")) {
    output('Die JSON Datei existiert nicht...');
    exit;
}

$string = file_get_contents("FSOExport.json");
if ($string === false) {
    output('$string === false');
    exit;
}

$json_a = json_decode($string, true);
if ($json_a === null) {
    output('$json_a === null');
    exit;
}

foreach ($json_a as $section => $section_arr) {
// ... Ausgabe der Daten
}
?>
Also dachte ich, dass ich dem StreamWriter := TStreamWriter.Create(FileStream, TEncoding.UTF8); die Codierung angebe.
Jetzt werden zwar die deutschen Umlaute korrekt gespeichert, das Skript steigt aber bei
Code:
output('$json_a === null');
aus.
Ich habe auch schon diverse PHP-Funktionen zur Konvertierung verwendet, aber irgendwie scheint nichts zu helfen.

Kann mir jemand helfen, der das Problem gelöst hat? Vielen Dank.
  Mit Zitat antworten Zitat