JSON und Umlaute

Anfängerfragen zum Programmieren mit PureBasic.
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

JSON und Umlaute

Beitrag von Angelo »

Mithilfe des GetHttpFile-Includes von HeXOR und einer php-Datei (abfrage.php) mache ich eine Abfrage in einer primitiven Tabelle - (personenname, lebensalter) - meiner MySQL-Datenbank. Für das Abfrageergebnis führe ich ein JSON-encode durch. Diesen JSON-String kann ich - wiederum mithilfe des GetHttpFile-Includes - aus dem Speicher auslesen und Parsen. Klappt im Prinzip auch, nur die Umlaute werden nicht richtig dargestellt: beispielsweise anstatt ä, Ä wird Ascii-Zeichen Nr. 4 und anstatt ö, Ö wird Ascii-Zeichen Nur. 6 rausgespuckt.

Ich schicke mal den Code der php-Datei und den PB-Code mit. Der Knackpunkt müsste meiner Ansicht nach im PB-Code beim JSON-Parsing sein.
Denn:
- Die Umlaute werden korrekt angezeigt, wenn ich in der php-Datei keinen JSON-encode und damit auch kein JON-Parsing in PB durchführe. Das heißt also, dass mit meiner Datenbank und dem php-Script utf8-mäßig wohl alles in Ordnung ist.
- Außerdem kann ich den JSON-encoded String in anderen Anwendungen (genauer: in einer App erstellt mit Basic4Android) korrekt mit Umlauten Parsen. Also dürfte auch die JSON-Kodierung im php-Script okay sein. Irgendetwas muss ich also beim JSON-Parsing im PB-Code übersehen habe.

Code: Alles auswählen

<?php
header('Content-Type: application/json_encode; charset=utf-8');
include ("access.php");

$db = mysqli_connect($db_host,$db_username,$db_password,$db_name) or die('Angelo, es gab einen Fehler');
mysqli_query($db, "SET CHARACTER SET 'utf8'") ;

$abfrage = "SELECT personenname, lebensalter FROM PersonenTabelle WHERE id > 4";
$ergebnis = mysqli_query($db, $abfrage);
$row = mysqli_fetch_object($ergebnis);
    if (!$row) {
    exit('Fehler! Es konnte keine Person ausgewählt werden!' . mysqli_error());
    }
$rows = array();
while($r = mysqli_fetch_assoc($ergebnis))
	{
	$rows[] = $r;
	}
exit(json_encode($rows));
    
?>

Code: Alles auswählen

.......

Structure Treffer
    personenname.s
    lebensalter.s
EndStructure
Global NewList trefferliste.Treffer()

OpenWindow(#window, 0, 0, 600, 500, "Abfrage", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)

url_string$ = "http://my_domain/abfrage.php"
   
GetFile = GetHTTP_CreateInterface()
   
GetFile\GetFileInMemory(url_string$, "", "", #INTERNET_FLAG_RESYNCHRONIZE, WindowID(#window), #WM_APP, #GETHTTP_MODE_ASYNC)

 Repeat
      Select WaitWindowEvent()
....
      Case #WM_APP           
            wParam  = EventwParam()
           *Buffer = GetFile\GetResult(wParam)
            If *Buffer
                #json = 33
               If CatchJSON(#JSON, *Buffer, MemorySize(*Buffer))
                    ExtractJSONList(JSONValue(#json), trefferliste())  
               Else 
                   Debug JSONErrorMessage()
               EndIf
            EndIf
            GetFile\FreeMem(wParam)
      EndSelect
 ForEver



PB 5.50; Win 7
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON und Umlaute

Beitrag von Kiffi »

den String im Buffer hast Du schon geprüft (also PeekS(*Buffer...))?

Grüße ... Peter
a²+b²=mc²
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: JSON und Umlaute

Beitrag von Angelo »

Ja, das habe ich als erstes gemacht, und zwar mit:
string$ = PeekS(*Buffer, -1, #PB_UTF8)
Da steht dann für die Umlaute so was wie /u00f drin. Und diese Zeichenfolge wird dann in Folge des Parsing-Prozesses zu Ascii-Zeichen Nr, 4,6, und 12, je nach Umlaut.
PB 5.50; Win 7
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: JSON und Umlaute

Beitrag von HeX0R »

Hast Du es mal dem Flag JSON_UNESCAPED_UNICODE bei json_encode() versucht?
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: JSON und Umlaute

Beitrag von Angelo »

Danke, Kiffi und HeXOR für Eure Hilfe! JSON_UNESCAPED_UNICODE hat's gebracht. Super! Danke! :allright:
PB 5.50; Win 7
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: JSON und Umlaute

Beitrag von Kiffi »

jetzt musst Du noch testen, ob Deine B4A-App nach wie vor funktioniert.

Grüße ... Peter
a²+b²=mc²
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: JSON und Umlaute

Beitrag von Angelo »

Richtig, ob das unter B4A auch funktioniert, muss ich jetzt noch ausprobieren.
Allerdings tut sich jetzt ein neues Problem für mich auf. Umlaute aus der Datenbank auslesen ist ja jetzt kein Problem mehr :) , aber wenn ich Wörter mit Umlauten übertragen will, zum Beispiel: "http://my_domain.de/hello.php?my_name=Günter", dann werden diese vom $_GET-Befehl nicht richtig übernommen. Habe schon auf PB-Seite URLEncoder() und php-seitig urldecode() eingesetzt - leider erfolglos.
PB 5.50; Win 7
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: JSON und Umlaute

Beitrag von Andesdaf »

wenn du mit UTF8 arbeitest, nimm auf PB-Seite lieber http://purebasic.fr/german/viewtopic.php?f=8&t=22286 für das URL-encoding.
Win11 x64 | PB 6.20
Angelo
Beiträge: 102
Registriert: 20.02.2010 14:47
Wohnort: Berlin

Re: JSON und Umlaute

Beitrag von Angelo »

Du hast mir den Sonntagmorgen (oder was davon noch übrig geblieben ist) gerettet. Ohne URLEncoderX() von helpy würde es nicht gehen! Danke für den Tipp!
PB 5.50; Win 7
Antworten