Jak usunąć ï »¿z początku pliku?


145

Mam plik CSS, który wygląda dobrze, gdy otwieram go za pomocą gedit , ale kiedy jest czytany przez PHP (aby scalić wszystkie pliki CSS w jeden), ten CSS ma dołączone następujące znaki: ï »¿

PHP usuwa wszystkie białe znaki, więc losowe ï »¿w środku kodu psuje całość. Jak wspomniałem, tak naprawdę nie widzę tych znaków, kiedy otwieram plik w gedit, więc nie mogę ich łatwo usunąć.

Wyszukałem problem w Google i najwyraźniej jest coś nie tak z kodowaniem plików, co ma sens, ponieważ przenoszę pliki na różne serwery Linux / Windows za pośrednictwem ftp i rsync , z różnymi edytorami tekstu. Nie znam jednak zbyt wiele na temat kodowania znaków, więc pomoc byłaby mile widziana.

Jeśli to pomoże, plik jest zapisywany w formacie UTF-8, a gedit nie pozwala mi zapisać go w formacie ISO-8859-15 (dokument zawiera jeden lub więcej znaków, których nie można zakodować przy użyciu określonego kodowania znaków). Próbowałem zapisać go z zakończeniami linii Windows i Linux, ale żadne nie pomogło.


Wydaje się, że rozwiązuje to problem. 95isalive.com/expression/index.html

30
Ktoś zdejmuje nas z BOM
David Heffernan,

Odpowiedzi:


150

Trzy słowa dla Ciebie:

Znacznik kolejności bajtów (BOM)

To jest reprezentacja BOM UTF-8 w ISO-8859-1. Musisz powiedzieć swojemu edytorowi, aby nie korzystał z zestawień komponentów lub użyj innego edytora, aby je usunąć.

Aby zautomatyzować usuwanie BOM, możesz użyć, awkjak pokazano w tym pytaniu .

Jak mówi inna odpowiedź , najlepiej byłoby, gdyby PHP faktycznie poprawnie zinterpretowało BOM, w tym celu możesz użyć mb_internal_encoding(), na przykład:

 <?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...
  ?>

Tak, znalazłem to, kiedy go wygooglowałem, ale jak je usunąć?
Matt

10
Nie usuwa BOM, ignoruje go.
Cole Johnson

Lub w inny sposób (zignoruj) może być zmiana kodowania.
mr5

Notatnik Windows (ugh) dodaje je; sugestią od dupka tego pytania jest użycie Notepad ++, który umożliwia ustawienie „UTF-8 bez BOM” jako kodowania. Lub użyj Real Editor ... (emacs!) :-)
jesup

2
Właśnie o to chodzi, różne kodowania znaków używają różnych bajtów dla tych samych znaków. Przeczytaj ponownie trzeci akapit odpowiedzi.
Vinko Vrsalovic

24

Otwórz plik w Notepad ++ . Z menu Kodowanie wybierz Konwertuj na UTF-8 bez BOM , zapisz plik, zastąp stary plik nowym plikiem. I to zadziała, cholera na pewno.


1
W Notepad ++ v7.6.6 (64-bit) musisz kliknąć Konwertuj na UTF-8 .
stomia

23

W PHP możesz wykonać następujące czynności, aby usunąć wszystkie znaki niebędące znakami, w tym dany znak.

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

1
jeśli chcesz po prostu zabić "ï", użyj $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Dodajesz dodatkowo /, powinno to być:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Dla tych z dostępem do powłoki tutaj jest małe polecenie, aby znaleźć wszystkie pliki z BOM ustawionym w katalogu public_html - pamiętaj, aby zmienić go na właściwą ścieżkę na serwerze

Kod:

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

a jeśli dobrze znasz edytor vi , otwórz plik w vi:

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

I wprowadź polecenie, aby usunąć zestawienie komponentów:

set nobomb

Zapisz plik:

wq

1
Służy grep -rlI $'\xEF\xBB\xBF' .do ignorowania plików binarnych.
Nabi KAZ

11

BOM to po prostu sekwencja znaków ($ EF $ BB $ BF dla UTF-8), więc po prostu usuń je za pomocą skryptów lub skonfiguruj edytor, aby nie był dodawany.

Od usuwania BOM z UTF-8 :

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

Jestem pewien, że łatwo tłumaczy się na PHP.


6
Należy zauważyć, że zestawienie komponentów nie jest sekwencją znaków, jest to pojedynczy znak. Jeśli plik jest w formacie UTF-8, znak jest reprezentowany w trzech bajtach . Jeśli plik jest w UTF-8, wyświetlenie go w innym kodowaniu (tj. Takim, w którym EF BB BF pojawia się tam, gdzie powinien znajdować się BOM) jest błędem. Aby usunąć BOM z pliku UTF-8, należy usunąć (pojedynczy) znak U + FEFF. Tak, pedanteria!
Jeffrey L Whitledge,

1
Nie mogłem tego uruchomić w PHP (to tylko moja niekompetencja, nie twoja: P), więc sprawdziłem, czy BOM jest tam i usunąłem pierwsze 3 znaki. Oto kod, jeśli ktoś go potrzebuje: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
tłumaczy się na php jako $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. zanim tego użyjesz, zastanów się ponownie, czy nie możesz zamiast tego naprawić problemu u źródła.
commonpike

6

U mnie to zadziałało:

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

Jeśli usunę tę metę, ï »¿pojawi się ponownie. Mam nadzieję, że to komuś pomoże ...


5

Nie znam PHP, więc nie wiem, czy jest to możliwe, ale najlepszym rozwiązaniem byłoby odczytanie pliku jako UTF-8 zamiast innego kodowania. BOM jest w rzeczywistości przestrzenią o zerowej szerokości i bez przerw. To są białe znaki, więc jeśli plik byłby odczytywany w poprawnym kodowaniu (UTF-8), wówczas BOM zostałby zinterpretowany jako biały znak i zostałby zignorowany w wynikowym pliku CSS.

Kolejną zaletą czytania pliku w poprawnym kodowaniu jest to, że nie musisz się martwić, że znaki zostaną źle zinterpretowane. Twój redaktor mówi ci, że strona kodowa, na której chcesz ją zapisać, nie będzie obsługiwać wszystkich potrzebnych znaków. Jeśli PHP odczytuje plik w niewłaściwym kodowaniu, to jest bardzo prawdopodobne, że inne znaki poza BOM są po cichu błędnie interpretowane. Używaj UTF-8 wszędzie, a te problemy znikną.


3

Możesz użyć

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

Zastępowanie przez awk wydaje się działać, ale nie ma go na miejscu.


2

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


Służy grep -rlI $'\xEF\xBB\xBF' .do ignorowania plików binarnych. A także .lepiej *tutaj.
Nabi KAZ

2

Miałem ten sam problem z BOM pojawiającym się w niektórych moich plikach PHP (ï »¿ï» ¿).

Jeśli używasz PhpStorma , możesz ustawić skrót klawiszowy, aby go usunąć w Ustawienia -> Ustawienia IDE -> Mapa klawiszy -> Menu główne -> Plik -> Usuń BOM.



2

Otwórz odpowiedni plik PHP w Notepad ++.

Kliknij Kodowanie u góry i zmień z „Kodowanie w UTF-8 bez BOM” na po prostu „Kodowanie w UTF-8”. Zapisz i nadpisz plik na swoim serwerze.


1

Ten sam problem, inne rozwiązanie.

Jedna linia w pliku PHP drukowała nagłówki XML (które używają tych samych znaczników początku / końca co PHP). Wygląda na to, że kod w tych tagach ustawił kodowanie i został wykonany w PHP, co spowodowało pojawienie się dziwnych znaków. Tak czy inaczej, oto rozwiązanie:

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

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

1

Jeśli potrzebujesz mieć możliwość usunięcia BOM z plików zakodowanych w UTF-8, musisz najpierw skontaktować się z redaktorem, który jest ich świadomy.

Osobiście korzystam z E Text Editor .

W prawym dolnym rogu znajdują się opcje kodowania znaków, w tym znacznik BOM. Załaduj plik, odznacz znacznik kolejności bajtów, jeśli jest zaznaczony, zapisz ponownie i powinno być zrobione.

Tekst alternatywny http://oth4.com/encoding.png

E nie jest darmowy, ale istnieje bezpłatna wersja próbna i jest to doskonały edytor (ograniczona kompatybilność z TextMate ).


1
Link do obrazu jest uszkodzony.
Peter Mortensen


1

Oto kolejne dobre rozwiązanie problemu z zestawieniem komponentów. To są dwa skrypty VBScript (.vbs).

Jeden za znalezienie BOM w pliku, a drugi za ZABIJCIE cholernego BOM w pliku. Działa całkiem dobrze i jest łatwy w użyciu.

Po prostu utwórz plik .vbs i wklej w nim następujący kod.

Możesz użyć skryptu VBScript, po prostu przeciągając i upuszczając podejrzany plik do pliku .vbs. Poinformuje Cię, czy istnieje zestawienie komponentów, czy nie.

' 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

Jeśli mówi, że istnieje BOM, przejdź i utwórz drugi plik .vbs z następującym kodem i przeciągnij plik podejrzanych do pliku .vbs.

' 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

Kod pochodzi od Heiko Jendreck .


1

W PHPStorm, dla wielu plików i BOM niekoniecznie na początku pliku, możesz wyszukać \x{FEFF}(wyrażenie regularne) i zastąpić niczym.


0

Ten sam problem, ale dotyczył tylko jednego pliku, więc po prostu utworzyłem pusty plik, skopiowałem / wklejiłem kod z oryginalnego pliku do nowego, a następnie zastąpiłem oryginalny plik. Nie wyszukane, ale zadziałało.



0

Miałem ten sam problem. Problem polegał na tym, że jeden z moich plików php znajdował się w utf-8 (najważniejszy, plik konfiguracyjny, który jest zawarty we wszystkich plikach php).

W moim przypadku miałem 2 różne rozwiązania, które działały dla mnie:

Najpierw zmieniłem konfigurację Apache za pomocą AddDefaultCharsetDirective w plikach konfiguracyjnych (lub w .htaccess). To rozwiązanie zmusza Apache do użycia prawidłowego kodowania.

AddDefaultCharset ISO-8859-1

Drugim rozwiązaniem była zmiana złego kodowania pliku php.


0
  1. Skopiuj tekst pliku filename.css.
  2. Zamknij plik css.
  3. Zmień nazwę na filename2.css, aby uniknąć konfliktu nazw plików.
  4. W programie MS Notepad lub Wordpad utwórz nowy plik.
  5. Wklej do niego tekst.
  6. Zapisz go jako nazwa_pliku.css, wybierając UTF-8 z opcji kodowania.
  7. Prześlij filename.css.

-3

Sprawdź swój index.php, znajdź „… charset=iso-8859-1” i zastąp go „… charset=utf-8”.

Może to zadziała.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.