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.