Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi und PHP: JSON und deutsche Umlaute (https://www.delphipraxis.net/207247-delphi-und-php-json-und-deutsche-umlaute.html)

amigage 6. Mär 2021 14:20

Delphi und PHP: JSON und deutsche Umlaute
 
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
Delphi-Quellcode:
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.

Uwe Raabe 6. Mär 2021 14:47

AW: Delphi und PHP: JSON und deutsche Umlaute
 
Kann es sein, dass PHP die Datei als UTF8 ohne BOM erwartet?

amigage 7. Mär 2021 11:38

AW: Delphi und PHP: JSON und deutsche Umlaute
 
Danke für den Hinweis!

Mit
Code:
$string = ltrim($string, chr(239).chr(187).chr(191));
vor dem
Code:
json_decode()
funktioniert es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz