UTF-8 BOM-Signatur in PHP-Dateien

Lesezeit: 8 Minuten

UTF 8 BOM Signatur in PHP Dateien
treznik

Ich habe einige kommentierte PHP-Klassen geschrieben und bin auf ein Problem gestoßen. Mein Name (für das @author-Tag) endet mit a ș (was ein UTF-8-Zeichen ist, … und ein seltsamer Name, ich weiß).

Obwohl ich die Datei als UTF-8 speichere, haben einige Freunde berichtet, dass sie sehen, dass dieses Zeichen völlig durcheinander ist (È™). Dieses Problem wird durch Hinzufügen der BOM-Signatur behoben. Aber das Ding beunruhigt mich ein bisschen, da ich nicht viel darüber weiß, außer von dem, was ich auf Wikipedia und einigen anderen ähnlichen Fragen hier auf SO gesehen habe.

Ich weiß, dass es einige Dinge am Anfang der Datei hinzufügt, und soweit ich verstanden habe, ist es nicht so schlimm, aber ich bin besorgt, weil die einzigen problematischen Szenarien, die ich über PHP-Dateien gelesen habe, betroffen sind. Und da ich PHP-Klassen schreibe, um sie zu teilen, ist es wichtiger, zu 100 % kompatibel zu sein, als meinen Namen in den Kommentaren zu haben.

Aber ich versuche, die Auswirkungen zu verstehen, sollte ich es ohne Bedenken verwenden? oder gibt es Fälle, in denen es zu Schäden kommen könnte? Wenn?

  • Beachten Sie, dass ich heute ein Problem hatte, bei dem a <?php die('test') Oben in einer enthaltenen PHP-Datei wurde die UTF-8-BOM angezeigt (diese Zeichen: ) oben in der Datei. Es war schwer herauszufinden. Da entdeckte ich, dass einer der Entwickler die Datei in Unicode gespeichert hat, nicht in ASCII, und dieses PHP konnte keine Unicode-PHP-Dateien lesen. Ich habe eine neue Kopie gestartet, Daten kopiert und in ASCII gespeichert, und das Problem wurde behoben. Beachten Sie, dass einige FTP-Programme Ihnen dies antun können, falls Sie jemals darauf stoßen.

    – Wolomike

    14. Mai 2012 um 15:12 Uhr

  • Beachten Sie auch, dass Session-Variablen seitenübergreifend nicht richtig zu funktionieren scheinen, wenn auf einer Seite dieses UTF-8-BOM-Problem auftritt. Ich musste einen Hex-Editor wie ghex auf Ubuntu plus verwenden iconv -f utf8 -t ascii old.php > new.php wiederholt, um alle Unicode-Probleme zu erkennen, sie zu entfernen und die Seite schließlich in ASCII ohne Fehler vom Befehl iconv zu speichern. Sobald dies erledigt war, bemerkte ich, dass Sitzungsvariablen zwischen den Seiten gehalten wurden.

    – Wolomike

    14. Mai 2012 um 15:50 Uhr

  • Es scheint, dass, wenn UTF-8 BOM in einer Datei erkannt wird, Header niemals gesendet werden, die eine Sitzung halten, und daher erhalten Sitzungsvariablen zwischen Seiten brandneue Sitzungen, anstatt dieselbe Sitzung zu halten.

    – Wolomike

    14. Mai 2012 um 16:00 Uhr

  • es ist nicht so, dass PHP die BOM “erkennt” und – falls vorhanden – “entscheidet”, die Session-Variablen zu verwerfen – das Problem ist, dass PHP (zumindest habe ich Versionen gesehen, die dies tun) die Datei liest, ein ï liest, es druckt, liest ein », druckt es, liest ein ¿, druckt es… das Problem ist nun, dass session_start() einige Header-Kommunikation verursacht, was nur passieren kann, während wir uns noch in der Header-Kommunikationsphase befinden – und das Drucken von etwas endet diese Phase. Wenn Sie die INI-Variable “display_errors” auf “On” gesetzt hätten, würden Sie eine Meldung erhalten, die Ihnen mitteilt, dass session_start aus diesem Grund fehlgeschlagen ist

    – Algomann

    2. Februar 2016 um 20:51 Uhr

Tatsächlich handelt es sich bei der Stückliste um tatsächliche Daten, die an den Browser gesendet werden. Der Browser wird es gerne ignorieren, aber Sie können dann immer noch keine Header senden.

Ich glaube, das Problem liegt wirklich in den Editoreinstellungen von Ihnen und Ihrem Freund. Ohne BOM erkennt der Editor Ihres Freundes die Datei möglicherweise nicht automatisch als UTF-8. Er kann versuchen, seinen Editor so einzurichten, dass der Editor erwartet eine Datei in UTF-8 sein (wenn Sie eine echte IDE wie NetBeans verwenden, dann kann dies sogar eine Projekteinstellung sein, die Sie zusammen mit dem Code übertragen können).

Eine Alternative ist es, ein paar Tricks auszuprobieren: Einige Editoren versuchen, die Codierung anhand einiger Heuristiken anhand des eingegebenen Textes zu ermitteln. Sie könnten versuchen, jede Datei mit zu beginnen

<?php //Úτƒ-8 encoded

und vielleicht bekommt es die Heuristik hin. Es gibt wahrscheinlich bessere Sachen, die man dort unterbringen kann, und Sie können entweder googeln, welche Art von Heuristiken zur Codierungserkennung üblich sind, oder einfach einige ausprobieren 🙂

Alles in allem empfehle ich, nur die Editor-Einstellungen zu korrigieren.

Oh warte, ich habe den letzten Teil falsch verstanden: Um den Code irgendwohin zu verbreiten, ist es am sichersten, alle Dateien nur die unteren 7-Bit-Zeichen enthalten zu lassen, dh reines ASCII, oder einfach zu akzeptieren, dass einige Leute mit alten Editoren es sehen Dein Name ist lustig geschrieben. Es gibt keinen sicheren Weg. Die Stückliste ist definitiv schlecht wegen der bereits gesendeten Header-Sache. Auf der anderen Seite, solange Sie nur UTF-8-Zeichen in Kommentare einfügen und so, ist die einzige Auswirkung eines Editor-Missverständnisses der Codierung seltsame Zeichen. Ich würde mich dafür entscheiden, Ihren Namen richtig zu schreiben und einen heuristischen Kommentar hinzuzufügen, damit die meisten Redakteure ihn verstehen, aber es wird immer Leute geben, die stattdessen falsche Zeichen sehen.

  • Danke für die Ratschläge. Ich habe verstanden, wo ich stehe, und ich denke, anstatt der Codierungserkennungsheuristik, die ein irgendwie seltsamer Kompromiss ist, werde ich die anständige Wahl treffen und meinen Namen mit einem “s” anstelle eines “ș” buchstabieren, so gut wie möglich Programmierer haben dieses Zeichen ohnehin nicht einmal in ihrer Sprache. Rechts? 🙂

    – treznik

    1. April 2010 um 14:39 Uhr

  • Browser ignorieren die BOM nicht. Und diese Fehler sind schwer nachzuvollziehen. Speichern Sie niemals PHP-Dateien mit BOM.

    – hakre

    9. August 2011 um 11:52 Uhr

  • Nein, weil es kein Bug ist. Die Stückliste ist ein Greuel, verwenden Sie sie nicht.

    – skrebbel

    20. März 2018 um 10:53 Uhr

  • Es ist mit Sicherheit ein Bug. PHP könnte es am Ende der Header-Phase leicht “re-flowen”. Es gibt viele gute Gründe für BOMs, einschließlich der Tatsache, dass trotz der technischen Möglichkeiten, Inhaltscodierungen neben ihren Dateien (einschließlich xattr/Windows ADS) zu speichern, nichts dies wirklich tut, also … wir BRAUCHEN es irgendwie -Band-Methoden, wie BOMs und der WAHRE Greuel von . Außerdem ist es nur eine magische Zahl, wie viele Codierungen/Dateiformate davor.

    – DimeCadmium

    18. Juni 2018 um 23:04 Uhr


BOM verursachen würde Headers already sent Fehler, daher können Sie BOM nicht in PHP-Dateien verwenden

1646459050 357 UTF 8 BOM Signatur in PHP Dateien
omabena

Dies ist ein alter Beitrag und wurde bereits beantwortet, aber ich kann Ihnen einige andere Ressourcen hinterlassen, die ich gefunden habe, als ich mit diesem BOM-Problem konfrontiert war.

http://people.w3.org/rishida/utils/bomtester/index.php Mit dieser Seite können Sie überprüfen, ob eine bestimmte Datei BOM enthält.

Es gibt auch ein praktisches Skript, das alle Dateien mit BOM in Ihrem aktuellen Verzeichnis ausgibt.

<?php 
function fopen_utf8 ($filename) { 
    $file = @fopen($filename, "r"); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") 
    { 
        return false; 
    } 
    else 
    { 
        return true; 
    } 
} 

function file_array($path, $exclude = ".|..|design", $recursive = true) { 
    $path = rtrim($path, "https://stackoverflow.com/") . "https://stackoverflow.com/"; 
    $folder_handle = opendir($path); 
    $exclude_array = explode("|", $exclude); 
    $result = array(); 
    while(false !== ($filename = readdir($folder_handle))) { 
        if(!in_array(strtolower($filename), $exclude_array)) { 
            if(is_dir($path . $filename . "https://stackoverflow.com/")) { 
                                // Need to include full "path" or it's an infinite loop 
                if($recursive) $result[] = file_array($path . $filename . "https://stackoverflow.com/", $exclude, true); 
            } else { 
                if ( fopen_utf8($path . $filename) ) 
                { 
                    //$result[] = $filename; 
                    echo ($path . $filename . "<br>"); 
                } 
            } 
        } 
    } 
    return $result; 
} 

$files = file_array("."); 
?>

Ich habe diesen Code bei php.net gefunden

Dreamweaver hilft auch dabei, es gibt Ihnen die Möglichkeit, die Datei zu speichern und das BOM-Zeug nicht einzuschließen

Es ist eine späte Antwort, aber ich hoffe immer noch, dass es hilft. Wiedersehen

  • Das Skript fopen_utf8() hat mir geholfen, eine BOM-Datei aus einem SDK zu isolieren, das ich von einem Anbieter verwendet habe. Sehr hilfreich!

    – Chris Rasco

    27. Januar 2014 um 18:10 Uhr

Nur damit Sie es wissen, es gibt eine Option in PHP, zend.multibytewodurch PHP Dateien mit BOM lesen kann, ohne die Headers already sent Error.

Aus der php.ini-Datei:

; If enabled, scripts may be written in encodings that are incompatible with
; the scanner.  CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings.  To use this feature, mbstring extension must be enabled.
; Default: Off
;zend.multibyte = Off

UTF 8 BOM Signatur in PHP Dateien
matthewv789

In PHP kann das Vorhandensein einer BOM zusätzlich zu dem Fehler “Header bereits gesendet” auch den HTML-Code im Browser auf subtilere Weise durcheinanderbringen.

Sehen Anzeigeprobleme durch UTF-8 BOM für einen Überblick über das Problem mit einem gewissen Fokus auf PHP (W3C Internationalization).

Wenn dies auftritt, gibt es normalerweise nicht nur einen auffälligen Platz am oberen Rand der gerenderten Seite, sondern wenn Sie den HTML-Code in Firefox oder Chrome untersuchen, stellen Sie möglicherweise fest, dass der Head-Abschnitt leer ist und seine Elemente im Body zu sein scheinen.

Natürlich zeigt das Anzeigen der Quelle alles dort an, wo es eingefügt wurde, aber der Browser interpretiert es als Körperinhalt (Text) und fügt es dort in das Dokumentobjektmodell (DOM) ein.

1646459051 704 UTF 8 BOM Signatur in PHP Dateien
Bobflux

Oder Sie könnten die Ausgabepufferung in der php.ini aktivieren, wodurch das Problem “Header bereits gesendet” gelöst wird. Es ist auch sehr wichtig, die Ausgabepufferung für die Leistung zu verwenden, wenn Ihre Site stark ausgelastet ist.

1646459051 648 UTF 8 BOM Signatur in PHP Dateien
hakre

BOM ist tatsächlich die effizienteste Methode, um eine UTF-8-Datei zu identifizieren, und sowohl moderne Browser als auch Standards unterstützen und fördern ihre Verwendung in HTTP-Antworttexten.

Im Falle von PHP-Dateien wird nicht die Datei, sondern die generierte Ausgabe als Antwort gesendet. Daher ist es offensichtlich keine gute Idee, alle PHP-Dateien mit der BOM am Anfang zu speichern, aber das bedeutet nicht, dass Sie die BOM nicht verwenden sollten in deiner Antwort.

Sie können den folgenden Code tatsächlich direkt vor Ihrer Doctype-Deklaration sicher einfügen (falls Sie HTML als Antwort generieren):

<?="\u{FEFF}"?> (oder vor PHP 7.0.0: <?="\xEF\xBB\xBF"?>)

Zum Weiterlesen: https://www.w3.org/International/questions/qa-byte-order-mark#transcoding

942850cookie-checkUTF-8 BOM-Signatur in PHP-Dateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy