HTML: Leerzeichen aus der Hölle

  • PHP

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von 3daycliff.

    HTML: Leerzeichen aus der Hölle

    Heyho zusammen

    Kurz und knapp: Nach der Umstellung aller Dateien von ANSI zu UTF8 werden mir jetzt plötzlich Leerzeichen angezeigt, wo keine sein sollten.
    Nun wird nämlich die Navigation nach unten verschoben..



    Ich habe mit Kommentaren und Ausgaben versucht den Fehler einzugrenzen, leider erfolglos.

    index.php:

    HTML-Quellcode

    1. <!DOCTYPE html>
    2. <html lang="de">
    3. <head>
    4. <!-- Meta -->
    5. <meta charset="utf-8">
    6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    7. <meta name="viewport" content="width=device-width, initial-scale=1">
    8. <!-- Settings -->
    9. <title>Nöggis Bike Shop</title>
    10. <!-- Bootstrap & CSS -->
    11. <link href="css/bootstrap.min.css" rel="stylesheet">
    12. <link href="css/bootstrap-theme.min.css" rel="stylesheet">
    13. <link href="css/style.css" rel="stylesheet">
    14. <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    15. <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    16. <!--[if lt IE 9]>
    17. <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    18. <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    19. <![endif]-->
    20. </head>
    21. <body>
    22. <!-- Test Start 1 -->
    23. <?php include("lib/base.php"); ?>
    24. <!-- Test Start 2 -->
    25. <?php if(Utils::getParam("page") == null){ header('Location: http://dancger.ch/nbs/index.php?page=home'); }; ?>
    26. <?php Utils::incl("nav"); ?>
    27. <div class="container"><?php Utils::incl(Utils::getParam("page")); ?></div>
    28. <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    29. <script src="js/bootstrap.min.js"></script>
    30. </body>
    31. </html>


    base.php:

    PHP-Quellcode

    1. <?php
    2. print "<!-- WAS ZUM -->";
    3. //Error Anzeige einschalten
    4. ini_set('display_startup_errors',1);
    5. ini_set('display_errors',1);
    6. error_reporting(-1);
    7. //Alle verfügbaren Bibliotheken/Klassen laden
    8. require("utils.php");
    9. print "<!-- HENKER -->";
    10. ?>


    utils.php:

    PHP-Quellcode

    1. <?php class Utils {
    2. // Parameter ermitteln
    3. public static function getParam($str_name){
    4. if(isset($_GET[$str_name])){
    5. return $_GET[$str_name];
    6. } else {
    7. return null;
    8. }
    9. }
    10. // File einbinden
    11. public static function incl($str_filename){
    12. print "<!-- Test Ende 1 -->";
    13. if($str_filename != null){
    14. print "<!-- Test Ende 2 -->";
    15. $pth = "http://dancger.ch/nbs/sites/".$str_filename.".html";
    16. print "<!-- Test Ende 3 -->";
    17. echo ltrim(file_get_contents($pth));
    18. } else {
    19. echo "404 - Page Param invalid";
    20. }
    21. }
    22. } ?>


    Woran liegts?
    (Und JA: Jede einzelne PHP / HTML Datei ist mit Notepad++ auf UTF-8 konvertiert)

    Gruss
    Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dancger“ ()

    Mit oder ohne Byte Order Mark? Ich vermute mal mit und da liegt wahrscheinlich der Fehler.

    Btw.: <?php if(Utils::getParam("page") == null){ header('Location: ...'); }; ?>​
    Wird/Sollte nicht funktionieren.

    PS: Sauberes/schönes HTML, hätte nur //ajax.googleapis.com/... statt https://ajax.googleapis.com/... verwendet. Analog im index.php, Zeile 21 und 22.
    PPS: Der PHP-Code ist nicht so toll. Vor allem utils.php, Zeile 17 und 19.

    Edit: Lass am besten auch das ?> bei "reinen" PHP-Dateien weg. Eventuell dahinterstehende Zeichen landen nämlich auch in der Ausgabe. Ist außerdem gute Praxis.
    Ich vermute auch, dass der Fehler bei der Byte Order Mark liegt. Diese wird von der include-Funktion nämlich evtl. nicht übersprungen und an dieser Stelle in die Ausgabe geschrieben. Mit einem normalen Editor bzw. wie in deinem Screenshot mit Firefox kannst du das Problem nicht nachvollziehen. Ob die Byte Order Mark verwendet wird und ob sie auch in der Ausgabe vorhanden ist, kannst du allerdings mithilfe eines Hex-Editor überprüfen.

    3daycliff schrieb:

    Mit oder ohne Byte Order Mark?
    Ich wusste bis anhin nicht einmal, dass sowas existiert. Aber du hattest recht, genau da lag der Fehler! :)

    3daycliff schrieb:

    Wird/Sollte nicht funktionieren.
    Funktioniert aber ohne Probleme. Wäre es schöner, den Parameter (der zwingend benötigt wird) manuell zu setzen und dann neu zu laden? Oder hast du was besseres auf Lager ^^

    3daycliff schrieb:

    PS: Sauberes/schönes HTML
    Meinst du damit eine lokale Kopie des Skripts oder die Erzwingung resp. Angabe des Protokolls?

    3daycliff schrieb:

    PPS: Der PHP-Code ist nicht so toll. Vor allem utils.php, Zeile 17 und 19.
    Weils schnell gehen musste, habe ich das Template von Bootstrap kopiert. Sagst du mir auch, wieso dass das unschön ist?

    3daycliff schrieb:

    Edit: Lass am besten auch das ?> bei "reinen" PHP-Dateien weg
    Das sieht extrem unsauber aus. Hat das irgendwelche Vorteile/Nachteile? (Ausser dem nachfolgend genannten?)

    Infinity schrieb:

    Mit einem normalen Editor bzw. wie in deinem Screenshot mit Firefox kannst du das Problem nicht nachvollziehen.
    Hab mir nun sämtliche Dateien von Notepad++ von "UTF-8" zu "UTF-8 ohne BOM" konvertieren lassen. Aber danke für den Tipp! Werd ich mir in der nächsten Programmiernacht mal zu Gemüte führen.

    Edit: Wieso hab ich eigentlich keine Benachrichtigung beim ersten Post von @3daycliff gekriegt... :huh:
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Könntest du mal die index.php und base.php in ein Zip werfen und als Datei anhängen? Denn in dem Code den du hier postest gehen evtl. vorhandene Steuerzeichen verloren bzw. werden rausgefiltert/nicht mit übertragen.
    Hab noch kurz die fixen Pfade angepasst. Jetzt kann man das auch anständig lokal testen.
    Ist alles wie auf dem Server, inkl. Bootstrap und JS.

    NBS1 Version 2
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dancger“ ()

    In den Dateien die du hoch geladen hast fehlt aber Code in der base.php
    Bilder
    • Unbenannt.png

      18,27 kB, 541×290, 100 mal angesehen
    Ich sehe da nichts, denk aber auch daran das die Daten im "Inspektor/Elements" visuell aufbereitet werden, das was übertragen wird siehst du im Quelltext (STRG + U).
    Bilder
    • Unbenannt.png

      13,33 kB, 527×269, 112 mal angesehen
    Ha, das hab ich total überlesen :D Danke für den Hinweis, dann sollte er den Thread aber auch als "erledigt" markieren.
    @slice Tut mir leid, dass du dir unnötige Mühe gemacht hast. :S
    ch dachte, dass du vielleicht noch was auf Lager hast und auf etwas hinaus willst.

    Der Thread ist noch offen, da ich auf eine Antwort @3daycliff gehofft/gewartet habe.. (wobei das unsinnig ist und er ja trotzdem noch antworten kann).
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Ich fasse mich mal kurz, da schon früh...

    Vor dem Aufruf der header-Funktion darf keine Ausgabe geschehen (da der Header logischerweise vor dem Body beim HTTP-Protokoll kommt). Falls doch (wie in deinem Code) sollte PHP eine Warnung ausgeben ("Header already sent"; ggf. durch Einstellungen unterdrückt). Die Weiterleitung daher sollte eigentlich nicht funktionieren...
    Entsprechend muss die Abfrage ganz am Anfang (noch vor dem doctype).

    Sauberes/schönes HTML: Welche lokale Kopie? Meinte das allgemein: doctype, konsistente Syntax, meta-Tags, kein halbes XML-gewurschtel etc. Sieht man (leider) nicht so oft.

    Zeile 17/19 unschön, weil Sicherheitslücke (zumindest wahrscheinlich...)

    Das mit ?> sieht aus HTML/XML-Sicht zwar unsauber aus, ist aber aus PHP-Sicht gute Praxis. Macht eigentlich jedes(?) größere Framework so. Vorteil ist, dass das was nach "?>" kommt, nicht mit ausgegeben wird z.B. weitere Whitespaces. Abgesehen von dem direkt auf ?> folgenden Zeilenumbruch, der vom PHP-Parser eh verworfen wird.

    Für Notepad++ gibt es übrigens auch ein Hex-Editor Plugin. Ist aber nicht stable und wird beim Update immer wieder in einen Unterordner verschoben (ist ja nur eine DLL). Tut aber seinen Dienst.