Seite 1 von 1

JSON und Umlaute

Verfasst: 21.03.2015 16:52
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




Re: JSON und Umlaute

Verfasst: 21.03.2015 17:41
von Kiffi
den String im Buffer hast Du schon geprüft (also PeekS(*Buffer...))?

Grüße ... Peter

Re: JSON und Umlaute

Verfasst: 21.03.2015 18:19
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.

Re: JSON und Umlaute

Verfasst: 21.03.2015 18:53
von HeX0R
Hast Du es mal dem Flag JSON_UNESCAPED_UNICODE bei json_encode() versucht?

Re: JSON und Umlaute

Verfasst: 21.03.2015 19:20
von Angelo
Danke, Kiffi und HeXOR für Eure Hilfe! JSON_UNESCAPED_UNICODE hat's gebracht. Super! Danke! :allright:

Re: JSON und Umlaute

Verfasst: 21.03.2015 20:59
von Kiffi
jetzt musst Du noch testen, ob Deine B4A-App nach wie vor funktioniert.

Grüße ... Peter

Re: JSON und Umlaute

Verfasst: 22.03.2015 02:13
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.

Re: JSON und Umlaute

Verfasst: 22.03.2015 12:08
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.

Re: JSON und Umlaute

Verfasst: 22.03.2015 13:44
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!