Come rimuovo ï »¿dall'inizio di un file?


145

Ho un file CSS che sembra buono quando lo apro usando gedit , ma quando viene letto da PHP (per unire tutti i file CSS in uno), questo CSS ha i seguenti caratteri anteposti: ï »¿

PHP rimuove tutto lo spazio, quindi un ï »¿casuale nel mezzo del codice rovina tutto. Come ho già detto, in realtà non riesco a vedere questi personaggi quando apro il file in gedit, quindi non posso rimuoverli molto facilmente.

Ho cercato su Google il problema, e c'è chiaramente qualcosa di sbagliato nella codifica dei file, il che ha senso essere come ho spostato i file su diversi server Linux / Windows tramite ftp e rsync , con una gamma di editor di testo. Non so molto sulla codifica dei caratteri, quindi l'aiuto sarebbe apprezzato.

Se aiuta, il file viene salvato nel formato UTF-8 e gedit non mi consente di salvarlo nel formato ISO-8859-15 (il documento contiene uno o più caratteri che non possono essere codificati utilizzando la codifica dei caratteri specificata). Ho provato a salvarlo con i finali di linea Windows e Linux, ma nessuno dei due ha aiutato.


Questo sembra risolvere il problema. 95isalive.com/expression/index.html

30
Qualcuno ci spoglia dalla BOM
David Heffernan,

Risposte:


151

Tre parole per te:

Byte Order Mark (BOM)

Questa è la rappresentazione per la distinta base UTF-8 in ISO-8859-1. Devi dire al tuo editor di non utilizzare le distinte materiali o di utilizzare un editor diverso per eliminarle.

Per automatizzare la rimozione della distinta componenti è possibile utilizzare awkcome mostrato in questa domanda .

Come dice un'altra risposta , il migliore sarebbe che PHP interpretasse effettivamente la DBA, per cui puoi usare mb_internal_encoding(), in questo modo:

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

Sì, l'ho scoperto quando ho cercato su Google, ma come posso rimuoverli?
Matt,

10
Non rimuove la DBA, la ignora.
Cole Johnson,

Altrimenti (ignora) potrebbe essere cambiare la codifica.
sig. 5

Windows Notepad (ugh) li aggiunge; il suggerimento di una duplicazione di questa domanda è l'uso di Notepad ++, che consente di impostare "UTF-8 senza BOM" come codifica. O usa un vero editor ... (emacs!) :-)
jesup,

2
Questo è esattamente il problema, codifiche di caratteri diverse utilizzano byte diversi per gli stessi caratteri. Leggi di nuovo il terzo paragrafo della risposta.
Vinko Vrsalovic,

24

Apri il tuo file in Notepad ++ . Dal menu Codifica , seleziona Converti in UTF-8 senza DBA , salva il file, sostituisci il vecchio file con questo nuovo file. E funzionerà, dannatamente sicuro.


1
In Notepad ++ v7.6.6 (64-bit) è necessario fare clic su Converti in UTF-8 .
ventre

23

In PHP , puoi fare quanto segue per rimuovere tutti i non caratteri incluso il personaggio in questione.

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

1
nel caso in cui volessi semplicemente eliminare "ï" usa questo $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Aggiungi un extra /, dovrebbe essere:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Per chi ha accesso alla shell ecco un piccolo comando per trovare tutti i file con la distinta componenti impostata nella directory public_html - assicurati di cambiarlo in quello che è il tuo percorso corretto sul tuo server

Codice:

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

e se hai dimestichezza con l' editor vi , apri il file in vi:

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

E inserisci il comando per rimuovere la DBA:

set nobomb

Salva il file:

wq

1
Utilizzare grep -rlI $'\xEF\xBB\xBF' .per ignorare i file binari.
Nabi KAZ,

11

BOM è solo una sequenza di caratteri ($ EF $ BB $ BF per UTF-8), quindi rimuovili utilizzando gli script o configura l'editor in modo che non venga aggiunto.

Dalla rimozione di BOM da UTF-8 :

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

Sono sicuro che si traduce facilmente in PHP.


6
Nota che la DBA non è una sequenza di caratteri, è un singolo carattere. Se il file è in UTF-8, il carattere è rappresentato in tre byte . Se il file si trova in UTF-8, visualizzarlo in un'altra codifica (ad esempio, quello in cui appare EF BB BF dove dovrebbe essere la distinta componenti) è un errore. Per rimuovere la distinta base da un file UTF-8, è necessario rimuovere il (singolo) carattere U + FEFF. Sì, pedanteria!
Jeffrey L Whitledge,

1
Non riuscivo a farlo funzionare in PHP (questa è solo la mia incompetenza, non la tua: P), quindi ho fatto un controllo per vedere se la DBA è lì e rimuovere i primi 3 caratteri. Ecco il codice, se qualcuno ne ha bisogno: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt,

7
si traduce in php come $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. prima di utilizzare questo, riconsiderare se non è possibile risolvere il problema alla fonte invece.
commonpike,

6

Per me ha funzionato:

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

Se rimuovo questo meta, appare di nuovo ï »¿. Spero che questo aiuti qualcuno ...


5

Non conosco PHP, quindi non so se questo sia possibile, ma la soluzione migliore sarebbe leggere il file come UTF-8 piuttosto che qualche altra codifica. La distinta base è in realtà uno SPAZIO DI LARGHEZZA NESSUNA SPAZIO. Questo è uno spazio bianco, quindi se il file fosse letto nella codifica corretta (UTF-8), allora la DBA sarebbe interpretata come uno spazio bianco e sarebbe ignorata nel file CSS risultante.

Inoltre, un altro vantaggio della lettura del file nella codifica corretta è che non devi preoccuparti che i caratteri vengano interpretati erroneamente. Il tuo editor ti sta dicendo che la tabella codici in cui vuoi salvarla non farà tutti i caratteri di cui hai bisogno. Se PHP sta leggendo il file con una codifica errata, è molto probabile che altri caratteri oltre alla distinta componenti vengano interpretati in modo errato. Usa UTF-8 ovunque e questi problemi scompaiono.


3

Puoi usare

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

La sostituzione con awk sembra funzionare, ma non è a posto.


2

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


Utilizzare grep -rlI $'\xEF\xBB\xBF' .per ignorare i file binari. E anche .meglio quindi *qui.
Nabi KAZ,

2

Ho avuto lo stesso problema con la distinta componenti visualizzata in alcuni dei miei file PHP (ï »¿ï» ¿).

Se si utilizza PhpStorm è possibile impostare il tasto di scelta rapida per rimuoverlo in Impostazioni -> Impostazioni IDE -> Keymap -> Menu principale -> File -> Rimuovi distinta componenti.



2

Apri il file PHP in questione, in Notepad ++.

Fai clic su Codifica in alto e passa da "Codifica in UTF-8 senza BOM" a "Codifica in UTF-8". Salva e sovrascrivi il file sul tuo server.


1

Stesso problema, soluzione diversa.

Una riga nel file PHP stampava le intestazioni XML (che usano gli stessi tag di inizio / fine di PHP). Sembra che il codice all'interno di questi tag abbia impostato la codifica ed è stato eseguito all'interno di PHP che ha prodotto strani caratteri. In entrambi i casi, ecco la soluzione:

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

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

1

Se devi essere in grado di rimuovere la distinta base dai file codificati UTF-8, devi prima procurarti un editor che ne sia a conoscenza.

Personalmente uso E Text Editor .

In basso a destra, ci sono opzioni per la codifica dei caratteri, incluso il tag DBA. Carica il tuo file, deseleziona Indicatore ordine byte se è selezionato, salva nuovamente e dovrebbe essere fatto.

Testo alternativo http://oth4.com/encoding.png

E non è gratuito, ma è disponibile una versione di prova gratuita ed è un editor eccellente ( compatibilità TextMate limitata ).


1
Il collegamento all'immagine è interrotto.
Peter Mortensen,

1

Puoi aprirlo con PhpStorm e fare clic con il tasto destro del mouse sul file e fare clic su Rimuovi BOM ...


1

Ecco un'altra buona soluzione per il problema con la distinta componenti. Questi sono due script VBScript (.vbs).

Uno per trovare la DBA in un file e uno per KILLING della Dannata maledizione nel file. Funziona abbastanza bene ed è facile da usare.

Basta creare un file .vbs e incollare il seguente codice in esso.

È possibile utilizzare lo script VBScript semplicemente trascinando il file sospetto sul file .vbs. Ti dirà se c'è una DBA o no.

' 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

Se ti dice che c'è una DBA, vai e crea il secondo file .vbs con il seguente codice e trascina il file suspicios sul file .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

Il codice è di Heiko Jendreck .


1

In PHPStorm, per più file e DBA non necessariamente all'inizio del file, puoi cercare \x{FEFF}(espressione regolare) e sostituirlo con nulla.


0

Stesso problema, ma ha interessato solo un file, quindi ho appena creato un file vuoto, copiato / incollato il codice dal file originale nel nuovo file e quindi sostituito il file originale. Non è lussuoso ma ha funzionato.



0

Ho avuto lo stesso problema. Il problema era perché uno dei miei file php era in utf-8 (il più importante, il file di configurazione incluso in tutti i file php).

Nel mio caso, avevo 2 diverse soluzioni che hanno funzionato per me:

Innanzitutto, ho modificato la configurazione di Apache utilizzando AddDefaultCharsetDirective nei file di configurazione (o in .htaccess). Questa soluzione obbliga Apache a utilizzare la codifica corretta.

AddDefaultCharset ISO-8859-1

La seconda soluzione era cambiare la codifica errata del file php.


0
  1. Copia il testo del tuo file nomefile.css.
  2. Chiudi il tuo file css.
  3. Rinominalo nomefile2.css per evitare uno scontro sul nomefile.
  4. In MS Notepad o Wordpad, creare un nuovo file.
  5. Incolla il testo in esso.
  6. Salvalo come nomefile.css, selezionando UTF-8 dalle opzioni di codifica.
  7. Carica nomefile.css.

-3

Controlla sul tuo index.php, trova "... charset=iso-8859-1" e sostituiscilo con "... charset=utf-8".

Forse funzionerà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.