Sonderzeichen bei API requests
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausprobieren
code
dach
datum
entfernen
fehler
funktion
genannten namen
http
machen
meldung
server
sonderzeichen
speziellen zeichen
spieler
string
tippen
url
versuchen
zahl
-
Hallo zusammen.
Ich benutze für meine Seite die Riot Games API. Wenn ich nun Daten anhand eines bestimmten Namens, welcher ein Sonderzeichen enthält, von meiner Seite aus in der API suchen will, kommt ein Fehler.
Beispiel: Ich möchte Daten von dem Spieler "iMS Phântom" haben. Über dem a ist ja so ein Dach. Wenn ich den Namen ohne Leerzeichen direkt auf der Seite der API eingebe, bekomme ich auch die nötigen Daten. Also so gebe ich ihn da ein: "iMSPhântom" der Link dazu wäre:
https://prod.api.pvp.net/api/lol/euw/v1.4/summoner/by-name/iMSPhântom?api_key=...
Wenn ich allerdings den Name auf meiner Seite eingebe, bekomme ich die Meldung, dass der Spieler nicht gefunden wurde. So sieht mein Code aus:
$post_server = htmlspecialchars($_POST['server']); $post_lolname = $_POST['lolname']; $post_lolname2 = str_replace(' ','',$post_lolname); // Leerzeichen entfernen $url = 'http://prod.api.pvp.net/api/lol/'.$post_server.'/v1.4/summoner/by-name/'.$post_lolname2.'?api_key=...'; $out = get_headers($url); list ($http, $zahl, $status) = explode(' ', $out[0], 3); // beim Leerzeichen aufteilen if($zahl == 200){ // Weiter im Code } elseif($zahl == 404){ echo"Der Beschwörer wurde auf diesem Server nicht gefunden!"; var_dump($post_lolname2); } else{ echo"Die Verbindung zur League of Legends API ist zur Zeit nicht möglich. Versuche es später nochmal!"; }
In dem var_dump bei der Fehlermeldung wird mir folgendes angezeigt:
string(10) "iMSPhântom"
Also genau das was ich auch auf der API Seite eingebe und da funktioniert es. Warum klappt nicht über meine Seite? Woran könnte das liegen?
Viele Grüße und danke schonmal für die Hilfe :)
EDIT: Ich habe herausgefunden, dass wenn ich den Namen so auf meiner Seite eingebe "iMSPh%C3%A2ntom", dass die Meldung dann nicht mehr kommt. Jetzt habe ich eine Funktion gesucht, die Sonderzeichen in diese speziellen Zeichen für URLs umwandelt. Ich habe urlencode() gefunden. Wenn ich es allerdings auf den oben genannten Namen anwende, gibt die var_dump Funktion folgendes aus:
string(12) "iMSPh%E2ntom"
Und nicht so, wie es richtig wäre: iMSPh%C3%A2ntom
Wie bekomme ich das also jetzt richtig hin?
Beitrag zuletzt geändert: 19.4.2014 13:02:49 von ultimate-bravery -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Auf anhieb würde ich hier auf das URL Encoding tippen. Heißt: Zuerst den Beschwörernamen standartisieren:
by the standardized summoner name, which is the summoner name in all lower case and with spaces removed
$summonername = 'Pêter'; $summonername = strtolower(str_replace(' ', '', $summonername));
Und jetzt würde ich die Anfrage dann noch URL-Typisch kodieren. Das heißt, die Sonderzeichen, wie auch das â durch eine Schreibweise wie "%C3%A2" ersetzen (das ist URL Typisch das â, das macht der Browser für dich draus). Um das nicht von Hand zu machen, kannst du eine Funktion nutzen:
$summonername = urlencode($summonername);
Der Beschwörername, der da jetzt in dem String steht, sollte an sich von der Riot Games API akzeptiert werden, da die den Wert sicherlich wieder rückrechnen.
Würde ich mal versuchen. Ich hab mich noch nicht für die API angemeldet (LoLKing macht seinen Job ganz gut), daher kann ich es nicht ausprobieren, aber ein Versuch ists wert.
Liebe Grüße
Vayne - The Night Hunter -
ultimate-bravery schrieb:
Das sieht stark nach einem Zeichensatzproblem aus. Du codierst deinen Text offenbar als ISO-8859-1, erwartest dir aber UTF-8.
Wenn ich es allerdings auf den oben genannten Namen anwende, gibt die var_dump Funktion folgendes aus:
string(12) "iMSPh%E2ntom"
Und nicht so, wie es richtig wäre: iMSPh%C3%A2ntom
Wie bekomme ich das also jetzt richtig hin?
Du hast aber noch einen Fehler in deinem Skript:$post_server = htmlspecialchars($_POST['server']);
sollte wohl eher$post_server = urlencode($_POST['server']);
heißen.
Beitrag zuletzt geändert: 19.4.2014 13:27:31 von hackyourlife -
Ok vielen Dank.
Ich habe es jetzt so gelöst:
$post_lolname = $_POST['lolname']; $post_lolname2 = urlencode(mb_convert_encoding(str_replace(' ','',$post_lolname), "UTF-8"));
So funktioniert es jetzt.
Du hast aber noch einen Fehler in deinem Skript:
1
$post_server = htmlspecialchars($_POST['server']);
sollte wohl eher
1
$post_server = urlencode($_POST['server']);
heißen.
Das htmlspecialchars sollte eher dafür sein, dass niemand etwas von meiner Seite aus ungewolltes an die Verarbeitung der Daten weiter gibt. Sonderzeichen kommen bei den Servern nämlich eh nicht vor. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage