kostenloser Webspace werbefrei: lima-city


Sonderzeichen bei API requests

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    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
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ultimate-bravery schrieb:
    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?
    Das sieht stark nach einem Zeichensatzproblem aus. Du codierst deinen Text offenbar als ISO-8859-1, erwartest dir aber UTF-8.

    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
  5. Autor dieses Themas

    ultimate-bravery

    ultimate-bravery hat kostenlosen Webspace.

    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.
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!