2010-07-15 15 views
114

Tengo un archivo CSS que se ve bien cuando lo abro usando gedit, pero cuando es leído por PHP (para unir todos los archivos CSS en uno), este CSS tiene los siguientes caracteres: ï »¿¿Cómo elimino ï »¿desde el comienzo de un archivo?

PHP elimina todos los espacios en blanco, por lo que un ï »¿aleatorio en el medio del código lo arruina todo. Como mencioné, no puedo ver estos caracteres cuando abro el archivo en gedit, así que no puedo eliminarlos muy fácilmente.

Busqué en Google el problema, y ​​hay claramente algo mal con la codificación del archivo, lo cual tiene sentido ya que he estado cambiando los archivos a diferentes servidores Linux/Windows a través de ftp y rsync, con una gama de editores de texto . Aunque no sé mucho sobre la codificación de caracteres, la ayuda será apreciada.

Si ayuda, el archivo se guarda en formato UTF-8, y gedit no me permite guardarlo en formato ISO-8859-15 (el documento contiene uno o más caracteres que no se pueden codificar utilizando el codificación de caracteres). Traté de guardarlo con terminaciones de línea de Windows y Linux, pero ninguno me ayudó.

+25

Alguien nos quita la BOM –

+0

Esto parece resolver el problema. http://www.95isalive.com/expression/index.html –

+1

http://stackoverflow.com/q/20778921/995714 –

Respuesta

120

tres palabras para ti:

Byte Order Mark (BOM)

Esa es la representación de la BOM UTF-8 en la norma ISO-8859-1. Debe decirle a su editor que no use las listas de materiales o que use un editor diferente para eliminarlas.

Para automatizar la eliminación de la BOM, puede usar awk como se muestra en this question.

Como another answer says, lo mejor sería para PHP para interpretar correctamente la lista de materiales en realidad, para eso se puede utilizar mb_internal_encoding(), así:

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

Sí, lo encontré cuando lo busqué en Google, pero ¿cómo puedo eliminarlo? – Matt

+1

Elimínelo manualmente con vim o algo así – Gus

+9

No elimina la lista de materiales, la ignora. –

1

Si tiene que ser capaz de eliminar la lista de materiales de UTF 8 archivos codificados, primero necesita obtener un editor que esté al tanto de ellos.

Personalmente uso E Text Editor.

En la parte inferior derecha, hay opciones para la codificación de caracteres, incluida la etiqueta BOM. Cargue su archivo, anule la selección de Byte Order Marker si está seleccionado, resave y debería hacerse.

Alt text http://oth4.com/encoding.png

E no es gratuita, pero hay una versión de prueba gratuita, y es un excelente editor (limitado TextMate compatibilidad).

+1

El enlace de la imagen está roto. –

5

No sé PHP, así que no sé si esto es posible, pero la mejor solución sería leer el archivo como UTF-8 en lugar de alguna otra codificación. La lista de materiales es en realidad un ESPACIO CERO SIN ESPACIO DE DESCANSO. Esto es un espacio en blanco, por lo que si el archivo se leyera con la codificación correcta (UTF-8), entonces la lista de materiales se interpretaría como un espacio en blanco y se ignoraría en el archivo CSS resultante.

Además, otra ventaja de leer el archivo con la codificación correcta es que no tiene que preocuparse de que los caracteres se malinterpreten. Su editor le dice que la página de códigos en la que desea guardarlo no incluirá todos los caracteres que necesita. Si PHP está leyendo el archivo en la codificación incorrecta, entonces es muy probable que otros caracteres además de la lista de materiales estén siendo malinterpretados silenciosamente. Use UTF-8 en todas partes, y estos problemas desaparecen.

11

BOM es solo una secuencia de caracteres ($ EF $ BB $ BF para UTF-8), así que simplemente elimínelos usando scripts o configure el editor para que no se agregue.

De Removing BOM from UTF-8:

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

estoy seguro de que se traduce en PHP con facilidad.

+6

Tenga en cuenta que la lista de materiales no es una secuencia de caracteres, es un solo carácter.Si el archivo está en UTF-8, entonces el carácter se representa en tres * bytes *. Si el archivo está en UTF-8, visualizarlo en otra codificación (es decir, una en la que EF BB BF aparece donde debería estar la LDM) es un error. Para eliminar la lista de materiales de un archivo UTF-8, se debe eliminar el carácter (único) U + FEFF. Sí, pedantería! –

+1

No pude conseguir que funcionara en PHP (esa es solo mi incompetencia, no la tuya: P), así que hice una comprobación para ver si la lista de materiales estaba allí y eliminé los primeros 3 caracteres. Aquí está el código, si alguien lo necesita: if (substr ($ css, 0,3) == paquete ("CCC", 0xef, 0xbb, 0xbf)) { $ css = substr ($ css, 3) ; } – Matt

+7

se traduce a php como '$ string = preg_replace ('/ \ x {EF} \ x {BB} \ x {BF} /', '', $ string);'. antes de usar esto, reconsidere si no puede solucionar el problema en la fuente en su lugar. – commonpike

1

Mismo problema, solución diferente.

Una línea del archivo PHP imprimía encabezados XML (que usan las mismas etiquetas de inicio/finalización que PHP). Parece que el código dentro de estas etiquetas establece la codificación, y se ejecutó dentro de PHP que dio como resultado los caracteres extraños. De cualquier manera aquí está la solución:

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

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

Uso Total Commander para buscar todos los archivos BOMED:

Elegant way to search for UTF-8 files with BOM?

  • abrir estos archivos en algún editor adecuado (que reconoce BOM) como Eclipse .

  • Cambia la codificación del archivo a ISO (clic derecho, propiedades).

  • Cut ï »¿desde el principio del archivo, guardar

  • Cambiar la codificación del archivo de nuevo a UTF-8

... y ni siquiera pensar en usar n. ..d de nuevo!

3

Puede utilizar

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

Sustitución con awk parece que funciona, pero no está en su lugar.

2

Tuve el mismo problema con la BOM que aparece en algunos de mis archivos PHP (ï »¿ï» ¿).

Si usa PhpStorm puede configurar la tecla de acceso directo para eliminarla en Configuración -> Configuración de IDE -> Mapa de teclas -> Menú principal -> Archivo -> Eliminar lista de materiales.

-3

Compruebe en su index.php, busque "... charset=iso-8859-1" y reemplázalo con "... charset=utf-8".

Quizás funcione.

17

Para los que tienen acceso a una consola aquí es un poco de comando para buscar todos los archivos con la lista de materiales ubicado en el directorio public_html - asegúrese de cambiarlo por lo que su ruta correcta en el servidor es

Código:

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

y si se siente cómodo con el editor vi, abra el archivo en vi:

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

e introduzca el comando para eliminar la lista de materiales:

set nobomb 

Guarde el archivo:

wq 
+1

Utilice 'grep -rlI $ '\ xEF \ xBB \ xBF' .' para ignorar los archivos binarios. –

0

Puede abrirlo por PhpStorm y haga clic derecho en el archivo y haga clic en Eliminar lista de materiales ...

2

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

+0

Utilice 'grep -rlI $ '\ xEF \ xBB \ xBF' .' para ignorar los archivos binarios. Y también '.' mejor que' * 'aquí. –

19

En PHP, puede hacer lo siguiente para eliminar todos los caracteres que no sean el carácter en cuestión.

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

en caso de que quiera matar a la "ï", use $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response); –

0

mismo problema, pero sólo afectó a un archivo por lo que acaba de crear un archivo en blanco, copiar/pegar el código del archivo original al nuevo archivo, y luego reemplazado el archivo original. No es lujoso, pero funcionó.

1

Aquí hay otra buena solución para el problema con la lista de materiales. Estos son dos scripts VBScript (.vbs).

Uno para encontrar la lista de materiales en un archivo y otra para eliminar la maldita lista de materiales en el archivo. Funciona bastante bien y es fácil de usar.

Simplemente cree un archivo .vbs y pegue el siguiente código en él.

Puede usar el script de VBScript simplemente arrastrando y soltando el archivo sospechoso en el archivo .vbs. Le dirá si hay una lista de materiales 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 

Si le informa que hay lista de materiales, vaya y cree el archivo .vbs segunda con el siguiente código y arrastrar el archivo suspicios en el archivo .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 

El código es de Heiko Jendreck.

5

Para mí, esto funcionó:

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

Si quito esta meta, la ï »¿vuelve a aparecer. Espero que esto ayude a alguien...

13

Abra su archivo en Notepad++. Desde Encoding menú, seleccione Convierta a UTF-8 sin BOM, guarde el archivo, reemplace el archivo anterior con este nuevo archivo. Y funcionará, malditamente seguro.

2

Abra el archivo PHP en cuestión, en Notepad ++.

Haga clic en Codificación en la parte superior y cambie de "Codificación en UTF-8 sin lista de materiales" a solo "Codificación en UTF-8". Guarde y sobrescriba el archivo en su servidor.

+0

¡Tan complicados son estos editores y codificaciones! – VSB

0

Tuve el mismo problema. El problema era porque uno de mis archivos php estaba en utf-8 (el más importante, el archivo de configuración que se incluye en todos los archivos php).

En mi caso, yo tenía 2 soluciones diferentes, que trabajaban para mí:

En primer lugar, he cambiado la configuración de Apache utilizando AddDefaultCharsetDirective en archivos de configuración (o en .htaccess). Esta solución obliga a Apache a usar la codificación correcta.

AddDefaultCharset ISO-8859-1 

La segunda solución fue cambiar la mala codificación del archivo php.

0
  1. Copie el texto de su archivo filename.css.
  2. Cierre el archivo css.
  3. Renómbrelo filename2.css para evitar un conflicto de nombre de archivo.
  4. En MS Notepad o Wordpad, cree un nuevo archivo.
  5. Pega el texto en él.
  6. Guárdelo como filename.css, seleccionando UTF-8 entre las opciones de codificación.
  7. Subir filename.css.
0

En PHPStorm, para varios archivos y BOM no necesariamente al principio del archivo, puede buscar \x{FEFF} (Expresión regular) y reemplazar por nada.

Cuestiones relacionadas