Wie entferne ich ï »¿vom Anfang einer Datei?


145

Ich habe eine CSS-Datei, die gut aussieht, wenn ich sie mit gedit öffne , aber wenn sie von PHP gelesen wird (um alle CSS-Dateien zu einer zusammenzuführen), werden diesem CSS die folgenden Zeichen vorangestellt: ï »¿

PHP entfernt alle Leerzeichen, so dass ein zufälliges ï »¿in der Mitte des Codes das Ganze durcheinander bringt. Wie bereits erwähnt, kann ich diese Zeichen beim Öffnen der Datei in gedit nicht sehen, daher kann ich sie nicht einfach entfernen.

Ich habe das Problem gegoogelt, und bei der Dateicodierung stimmt eindeutig etwas nicht. Dies ist sinnvoll, da ich die Dateien über FTP und Rsync mit einer Reihe von Texteditoren auf verschiedene Linux / Windows-Server verschoben habe . Ich weiß allerdings nicht viel über Zeichenkodierung, daher wäre Hilfe willkommen.

Wenn dies hilft, wird die Datei im UTF-8-Format gespeichert, und mit gedit kann ich sie nicht im ISO-8859-15-Format speichern (das Dokument enthält ein oder mehrere Zeichen, die mit der angegebenen Zeichencodierung nicht codiert werden können). Ich habe versucht, es mit Windows- und Linux-Zeilenenden zu speichern, aber beides hat nicht geholfen.


Dies scheint das Problem zu lösen. 95isalive.com/expression/index.html

30
Jemand streift uns von der Stückliste ab
David Heffernan

Antworten:


150

Drei Wörter für Sie:

Byte Order Mark (Stückliste)

Dies ist die Darstellung für die UTF-8-Stückliste in ISO-8859-1. Sie müssen Ihren Editor anweisen, keine Stücklisten zu verwenden oder einen anderen Editor zu verwenden, um sie zu entfernen.

Um das Entfernen der Stückliste zu automatisieren, können Sie awkwie in dieser Frage gezeigt verwenden .

Wie eine andere Antwort sagt , ist es für PHP am besten, die Stückliste tatsächlich richtig zu interpretieren, dafür können Sie Folgendes verwenden mb_internal_encoding():

 <?php
   //Storing the previous encoding in case you have some other piece 
   //of code sensitive to encoding and counting on the default value.      
   $previous_encoding = mb_internal_encoding();

   //Set the encoding to UTF-8, so when reading files it ignores the BOM       
   mb_internal_encoding('UTF-8');

   //Process the CSS files...

   //Finally, return to the previous encoding
   mb_internal_encoding($previous_encoding);

   //Rest of the code...
  ?>

Ja, das habe ich gefunden, als ich gegoogelt habe, aber wie entferne ich sie?
Matt

10
Die Stückliste wird nicht entfernt, sondern ignoriert.
Cole Johnson

Oder anders (ignorieren) könnte die Codierung ändern.
Mr5

Windows Notepad (ugh) fügt sie hinzu; Ein Dup dieser Frage schlägt vor, Notepad ++ zu verwenden, mit dem "UTF-8 ohne Stückliste" als Codierung festgelegt werden kann. Oder benutze einen Real Editor ... (emacs!) :-)
jesup

2
Genau das ist das Problem. Unterschiedliche Zeichenkodierungen verwenden unterschiedliche Bytes für dieselben Zeichen. Lesen Sie noch einmal den dritten Absatz der Antwort.
Vinko Vrsalovic

24

Öffnen Sie Ihre Datei in Notepad ++ . Aus dem Encoding - Menü wählen Sie Convert to UTF-8 ohne BOM , speichern Sie die Datei, die alte Datei mit der neuen Datei ersetzen. Und es wird funktionieren, verdammt sicher.


1
In Notepad ++ v7.6.6 (64-Bit) müssen Sie auf In UTF-8 konvertieren klicken .
Stomy

23

In PHP können Sie Folgendes tun, um alle Nicht-Zeichen einschließlich des betreffenden Zeichens zu entfernen.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);

1
Für den Fall, dass Sie nur das "ï" beenden möchten, verwenden Sie diese $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Sie fügen ein Extra hinzu /, es sollte sein:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Für Benutzer mit Shell-Zugriff gibt es hier einen kleinen Befehl zum Suchen aller Dateien mit der Stückliste im Verzeichnis public_html. Stellen Sie sicher, dass Sie den korrekten Pfad auf Ihrem Server ändern

Code:

grep -rl $'\xEF\xBB\xBF' /home/username/public_html

und wenn Sie mit dem vi- Editor vertraut sind , öffnen Sie die Datei in vi:

vi /path-to-file-name/file.php

Geben Sie den Befehl zum Entfernen der Stückliste ein:

set nobomb

Speicher die Datei:

wq

1
Verwenden Sie grep -rlI $'\xEF\xBB\xBF' .diese Option, um Binärdateien zu ignorieren.
Nabi KAZ

11

Stückliste ist nur eine Folge von Zeichen ($ EF $ BB $ BF für UTF-8). Entfernen Sie sie also einfach mithilfe von Skripten oder konfigurieren Sie den Editor so, dass er nicht hinzugefügt wird.

Vom Entfernen der Stückliste aus UTF-8 :

#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);

Ich bin sicher, dass es leicht in PHP übersetzt werden kann.


6
Beachten Sie, dass die Stückliste keine Folge von Zeichen ist, sondern ein einzelnes Zeichen. Wenn sich die Datei in UTF-8 befindet, wird das Zeichen in drei Bytes dargestellt . Wenn sich die Datei in UTF-8 befindet, ist das Anzeigen in einer anderen Codierung (dh einer, in der EF BB BF dort angezeigt wird, wo sich die Stückliste befinden sollte) ein Fehler. Um die Stückliste aus einer UTF-8-Datei zu entfernen, sollte das (einzelne) Zeichen U + FEFF entfernt werden. Ja, Pedanterie!
Jeffrey L Whitledge

1
Ich konnte das in PHP nicht zum Laufen bringen (das ist nur meine Inkompetenz, nicht deine: P), also habe ich überprüft, ob die Stückliste vorhanden ist, und die ersten 3 Zeichen entfernt. Hier ist der Code, falls jemand ihn benötigt: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
es übersetzt in php als $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. Bevor Sie dies verwenden, überlegen Sie erneut, ob Sie das Problem nicht an der Quelle beheben können.
Commonpike

6

Für mich hat das funktioniert:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Wenn ich dieses Meta entferne, erscheint das ï »¿erneut. Hoffe das hilft jemandem ...


5

Ich kenne PHP nicht, daher weiß ich nicht, ob dies möglich ist, aber die beste Lösung wäre, die Datei als UTF-8 und nicht als eine andere Codierung zu lesen. Die Stückliste ist eigentlich ein ZERO WIDTH NO BREAK SPACE. Dies ist ein Leerzeichen. Wenn also die Datei in der richtigen Codierung (UTF-8) gelesen wird, wird die Stückliste als Leerzeichen interpretiert und in der resultierenden CSS-Datei ignoriert.

Ein weiterer Vorteil des Lesens der Datei in der richtigen Codierung besteht darin, dass Sie sich keine Sorgen machen müssen, dass Zeichen falsch interpretiert werden. Ihr Editor teilt Ihnen mit, dass die Codepage, in der Sie sie speichern möchten, nicht alle erforderlichen Zeichen enthält. Wenn PHP die Datei dann in der falschen Codierung liest, ist es sehr wahrscheinlich, dass andere Zeichen neben der Stückliste stillschweigend falsch interpretiert werden. Verwenden Sie UTF-8 überall, und diese Probleme verschwinden.


3

Sie können verwenden

vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'

Das Ersetzen durch awk scheint zu funktionieren, ist jedoch nicht vorhanden.


2

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | set nobomb | wq '


Verwenden Sie grep -rlI $'\xEF\xBB\xBF' .diese Option, um Binärdateien zu ignorieren. Und auch .besser als *hier.
Nabi KAZ

2

Ich hatte das gleiche Problem mit der Stückliste, die in einigen meiner PHP-Dateien angezeigt wurde (ï »¿ï» ¿).

Wenn Sie PhpStorm verwenden , können Sie den Hotkey festlegen, um ihn unter Einstellungen -> IDE-Einstellungen -> Keymap -> Hauptmenü -> Datei -> Stückliste entfernen zu entfernen.



2

Öffnen Sie die betreffende PHP-Datei in Notepad ++.

Klicken Sie oben auf Codierung und wechseln Sie von "Codierung in UTF-8 ohne Stückliste" zu "Codierung in UTF-8". Speichern und überschreiben Sie die Datei auf Ihrem Server.


1

Gleiches Problem, andere Lösung.

Eine Zeile in der PHP-Datei druckte XML-Header aus (die dieselben Start- / End-Tags wie PHP verwenden). Es sieht so aus, als ob der Code in diesen Tags die Codierung festlegt und in PHP ausgeführt wurde, was zu den seltsamen Zeichen führte. So oder so ist hier die Lösung:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

Wenn Sie in der Lage sein müssen, die Stückliste aus UTF-8-codierten Dateien zu entfernen, müssen Sie zuerst einen Editor beschaffen, der diese kennt.

Ich persönlich benutze E Text Editor .

Unten rechts gibt es Optionen für die Zeichenkodierung, einschließlich des Stücklisten-Tags. Laden Sie Ihre Datei, deaktivieren Sie die Option "Byte Order Marker", wenn sie ausgewählt ist, speichern Sie sie erneut, und dies sollte geschehen.

Alternativtext http://oth4.com/encoding.png

E ist nicht kostenlos, aber es gibt eine kostenlose Testversion und es ist ein ausgezeichneter Editor (eingeschränkte TextMate- Kompatibilität).


1
Der Bildlink ist defekt.
Peter Mortensen

1

Sie können es mit PhpStorm öffnen und mit der rechten Maustaste auf Ihre Datei klicken und auf Stückliste entfernen ...


1

Hier ist eine weitere gute Lösung für das Problem mit der Stückliste. Dies sind zwei VBScript- Skripte (.vbs).

Eine zum Auffinden der Stückliste in einer Datei und eine zum TÖTEN der verdammten Stückliste in der Datei. Es funktioniert ziemlich gut und ist einfach zu bedienen.

Erstellen Sie einfach eine .vbs-Datei und fügen Sie den folgenden Code ein.

Sie können das VBScript-Skript einfach verwenden, indem Sie die verdächtige Datei in die .vbs-Datei ziehen und dort ablegen. Hier erfahren Sie, ob eine Stückliste vorhanden ist oder nicht.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' find_BOM.vbs
' ====================
' Kleines Hilfsmittel, welches das BOM finden soll
'
 Const UTF8_BOM = ""
 Const UTF16BE_BOM = "þÿ"
 Const UTF16LE_BOM = "ÿþ"
 Const ForReading = 1
 Const ForWriting = 2
 Dim fso
 Set fso = WScript.CreateObject("Scripting.FileSystemObject")
 Dim f
 f = WScript.Arguments.Item(0)
 Dim t
 t = fso.OpenTextFile(f, ForReading).ReadAll
 If Left(t, 3) = UTF8_BOM Then
     MsgBox "UTF-8-BOM detected!"
 ElseIf Left(t, 2) = UTF16BE_BOM Then
     MsgBox "UTF-16-BOM (Big Endian) detected!"
 ElseIf Left(t, 2) = UTF16LE_BOM Then
     MsgBox "UTF-16-BOM (Little Endian) detected!"
 Else
     MsgBox "No BOM detected!"
 End If

Wenn Sie erfahren, dass Stückliste vorhanden ist, erstellen Sie die zweite .vbs-Datei mit dem folgenden Code und ziehen Sie die verdächtige Datei in die .vbs-Datei.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' kill_BOM.vbs
' ====================
' Kleines Hilfmittel, welches das gefundene BOM löschen soll
'
Const UTF8_BOM = ""
Const ForReading = 1
Const ForWriting = 2
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Dim f
f = WScript.Arguments.Item(0)
Dim t
t = fso.OpenTextFile(f, ForReading).ReadAll
If Left(t, 3) = UTF8_BOM Then
    fso.OpenTextFile(f, ForWriting).Write (Mid(t, 4))
    MsgBox "BOM gelöscht!"
Else
    MsgBox "Kein UTF-8-BOM vorhanden!"
End If

Der Code stammt von Heiko Jendreck .


1

In PHPStorm können Sie für mehrere Dateien und Stücklisten, die nicht unbedingt am Anfang der Datei stehen, suchen \x{FEFF}(regulärer Ausdruck) und durch nichts ersetzen.


0

Das gleiche Problem, aber es betraf nur eine Datei. Ich habe gerade eine leere Datei erstellt, den Code aus der Originaldatei in die neue Datei kopiert / eingefügt und dann die Originaldatei ersetzt. Nichts Besonderes, aber es hat funktioniert.


0

Verwenden Sie Total Commander , um nach allen BOMed-Dateien zu suchen:

Elegante Möglichkeit, mit Stückliste nach UTF-8-Dateien zu suchen?

  • Öffnen Sie diese Dateien in einem geeigneten Editor (der Stücklisten erkennt) wie Eclipse .

  • Ändern Sie die Codierung der Datei in ISO (Rechtsklick, Eigenschaften).

  • Schneiden Sie ï »¿vom Anfang der Datei ab, speichern Sie

  • Ändern Sie die Codierung der Datei wieder in UTF-8

... und denken Sie nicht einmal daran, n ... d wieder zu verwenden!


0

Ich hatte das gleiche Problem. Das Problem war, dass sich eine meiner PHP-Dateien in utf-8 befand (die wichtigste ist die Konfigurationsdatei, die in allen PHP-Dateien enthalten ist).

In meinem Fall hatte ich zwei verschiedene Lösungen, die für mich funktionierten:

Zuerst habe ich die Apache-Konfiguration mithilfe von AddDefaultCharsetDirective in Konfigurationsdateien (oder in .htaccess) geändert. Diese Lösung zwingt Apache, die richtige Codierung zu verwenden.

AddDefaultCharset ISO-8859-1

Die zweite Lösung bestand darin, die fehlerhafte Codierung der PHP-Datei zu ändern.


0
  1. Kopieren Sie den Text Ihrer Datei filename.css.
  2. Schließen Sie Ihre CSS-Datei.
  3. Benennen Sie es in filename2.css um, um einen Dateinamenkonflikt zu vermeiden.
  4. Erstellen Sie in MS Notepad oder Wordpad eine neue Datei.
  5. Fügen Sie den Text ein.
  6. Speichern Sie es als filename.css und wählen Sie UTF-8 aus den Codierungsoptionen aus.
  7. Laden Sie filename.css hoch.

-3

Überprüfen Sie Ihre index.php, finden Sie "... charset=iso-8859-1" und ersetzen Sie sie durch "... charset=utf-8".

Vielleicht klappt es.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.