![]() |
TJson.Format und Umlaute
Hallo!
Mir ist aufgefallen, dass TJson.Format mit Umlauten nicht klar kommt. Wenn ich in einem Json-String z.B. das Wort "Straße" habe und mir den JsonValue mit .ToString ausgeben lasse, wird daraus völlig korrekt "Stra\u00dfe". Bei einem TJson.Format(MyJsonValue) wird daraus aber ein "Straße" als Unicode-String. Was dann natürlich bei mir im weiteren Verlauf beim Versenden via Indy zu serverseitigem Umlautesalat führt. Übergangsweise sende ich jetzt erstmal unformatiertes JSON, damit scheints zu gehen. Aber wie bekomme ich ein korrekt UTF8-kodiertes und formatiertes JSON zusammen? Einfach ein UTF8Encode(TJson.Format(MyJsonValue)) machen? Grüße Cody |
AW: TJson.Format und Umlaute
Da ein JSON-String in UTF8 kodiert wird dürfen nur UTF8-Zeichen verwendet werden.
Zitat:
![]() Hier die komplette Liste mit allen UTF8 Zeichen. ![]() Wie du siehst ist da auch das ß dabei, also ist da erst einmal alles korrekt. |
AW: TJson.Format und Umlaute
Nein ist nicht korrekt. Ich red auch nicht von der Json-Spezifikation sondern davon was Delphi da veranstaltet. TJson.Format gibt eben keinen String mit escaped Unicode-Chars zurück sondern einen Delphi-Unicode-String unescaped.
|
AW: TJson.Format und Umlaute
Also wenn wir davon reden, was Delphi da mittels
Delphi-Quellcode:
veranstaltet, dann müssen wir auch über die JSON-Spezifikation sprechen, denn das war die Grundlage für die Funktionsweise von
TJson
Delphi-Quellcode:
.
TJson
Das Delphi einen "normalen"
Delphi-Quellcode:
als Ergebnis zurückliefert, ja das sollte klar sein. Allerdings sollten sich nach dem
string
Delphi-Quellcode:
nur noch Zeichen befinden, die sich auch in der UTF8-Zeichentabelle befinden.
TJson.Format
Und warum sollte da etwas escaped werden, wenn es nicht escaped werden muss (das Zeichen ist in der UTF8-Zeichentabelle enthalten). Ansonsten, welche Zeichen sollen denn alle escaped werden? Alle? Einige? Nach welchen Kriterien? Aber eventuell hilft dir auch noch die Beschreibung aus der RFC Zitat:
![]() Daraus geht hervor, was escaped werden muss, und was escaped werden darf. PS Mich dünkt du hast ein anderes Problem und versuchst dieses nun dem JSON in die Schuhe zu schieben. |
AW: TJson.Format und Umlaute
Siehe Eingangspost. TJsonValue.ToString und TJson.Format verhalten sich unterschiedlich. Da ich anwenderseitig eine Umschaltmöglichkeit zwischen formatiert und unformatiert habe, brauche ich eine Vereinheitlichung was den Umgang mit Umlauten angeht.
|
AW: TJson.Format und Umlaute
Nur nochmal das Ergebnis:
Delphi-Quellcode:
ergibt
procedure p();
var jsonObject: TJSONObject; begin jsonObject := TJsonObject.Create(); jsonObject.AddPair('text', 'Straße'); Writeln( jsonObject.ToString() ); Writeln( jsonObject.ToJSON() ); WriteLn( Rest.Json.TJson.Format(jsonObject) ); end;
Code:
{"text":"Straße"}
{"text":"Stra\u00DFe"} { "text":"Straße" } |
AW: TJson.Format und Umlaute
Zur Ausgangsfrage zurück:
Zitat:
Delphi-Quellcode:
ergibtprocedure p(); var jsonObject: TJSONObject; begin jsonObject := TJsonObject.Create(); jsonObject.AddPair('text', 'Straße'); Writeln( jsonObject.ToString() ); // unformatiert WriteLn( Rest.Json.TJson.Format(jsonObject) ); // formatiert end;
Code:
Um davon jetzt eine UTF8 kodierte Bytefolge zu erhalten nimmt man z.B.
{"text":"Straße"}
{ "text":"Straße" }
Delphi-Quellcode:
.
TEncoding.UTF8.GetBytes( json );
Wenn man etwas mit Indy verschicken will, dann reicht es in der Regel den String zu verwenden und die entsprechend gewünschte Kodierung anzugeben. Das Umwandeln von dem String in die Kodierung übernehmen dann eigentlich die Indy-Komponenten. Nur so nebenbei erwähnt: Das Ergebnis
Code:
wird ja auch in einem Delphi-Unicode zurückgegeben. Ist also auch nicht UTF8 oder was auch immer vermutet.
{"text":"Stra\u00DFe"}
|
AW: TJson.Format und Umlaute
Der Unterschied sind die intern verwendeten Methoden. Während ToString und Format auf ToChars zurückgreifen, macht ToJSON Gebrauch von ToBytes. Bei einem TJSONString ist ToBytes aber so implementiert, daß es alle Zeichen > #128 (und auch ein paar < #32) als /u escaped darstellt. Das ToChars beschränkt sich da lediglich auf ein paar spezielle Zeichen.
|
AW: TJson.Format und Umlaute
Zitat:
|
AW: TJson.Format und Umlaute
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz