¿Cómo elimino ï »¿desde el principio de un archivo?


145

Tengo un archivo CSS que se ve bien cuando lo abro usando gedit , pero cuando es leído por PHP (para combinar todos los archivos CSS en uno), este CSS tiene los siguientes caracteres antepuestos: ï »¿

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

Busqué en Google el problema, y ​​claramente hay algo mal con la codificación del archivo, lo que tiene sentido ya que he estado cambiando los archivos a diferentes servidores Linux / Windows a través de ftp y rsync , con una variedad de editores de texto. Sin embargo, no sé mucho sobre codificación de caracteres, por lo que agradecería su ayuda.

Si ayuda, el archivo se está guardando 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 pueden codificarse utilizando la codificación de caracteres especificada). Intenté guardarlo con los finales de línea de Windows y Linux, pero ninguno me ayudó.


Esto parece resolver el problema. 95isalive.com/expression/index.html

30
Alguien nos despoja de la lista de materiales
David Heffernan

Respuestas:


151

Tres palabras para ti:

Marca de orden de bytes (BOM)

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

Para automatizar la eliminación de la lista de materiales, puede usar awkcomo se muestra en esta pregunta .

Como dice otra respuesta , lo mejor sería que PHP interprete realmente la lista de materiales correctamente, para eso puede usar 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...
  ?>

Sí, lo encontré cuando busqué en Google, pero ¿cómo los elimino?
Matt

10
No elimina la lista de materiales, la ignora.
Cole Johnson

O la otra forma (ignorar) podría ser cambiar la codificación.
Mr5

Windows Notepad (ugh) los agrega; La sugerencia de un duplicado de esta pregunta es usar Notepad ++, que permite configurar "UTF-8 sin BOM" como codificación. O use un editor real ... (¡emacs!) :-)
jesup

2
Ese es exactamente el problema, las diferentes codificaciones de caracteres usan bytes diferentes para los mismos caracteres. Lea nuevamente el tercer párrafo de la respuesta.
Vinko Vrsalovic

24

Abra su archivo en Notepad ++ . En el menú Codificación , seleccione Convertir a UTF-8 sin BOM , guarde el archivo, reemplace el archivo antiguo con este nuevo archivo. Y funcionará, maldita sea.


1
En Notepad ++ v7.6.6 (64 bits) debe hacer clic en Convertir a UTF-8 .
Stomy

23

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

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

1
en caso de que solo quiera matar el "ï" use este $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

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

20

Para aquellos con acceso de shell, aquí hay un pequeño comando para encontrar todos los archivos con la lista de materiales configurada en el directorio public_html; asegúrese de cambiarla a la ruta correcta en su servidor

Código:

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

y si te sientes cómodo con el editor vi , abre el archivo en vi:

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

E ingrese el comando para eliminar la lista de materiales:

set nobomb

Guarda el archivo:

wq

1
Use grep -rlI $'\xEF\xBB\xBF' .para ignorar archivos binarios.
Nabi KAZ

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 Extracción de lista de materiales de UTF-8 :

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

Estoy seguro de que se traduce a PHP fácilmente.


66
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, el carácter se representa en tres bytes . Si el archivo está en UTF-8, verlo en otra codificación (es decir, una en la que aparece EF BB BF donde debería estar la lista de materiales) es un error. Para eliminar la lista de materiales de un archivo UTF-8, se debe eliminar el (único) carácter U + FEFF. Sí, pedantería!
Jeffrey L Whitledge

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

77
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.
commonpike

6

Para mí, esto funcionó:

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

Si elimino este meta, el ï »¿aparece de nuevo. Espero que esto ayude a alguien...


5

No conozco 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 ANCHO SIN DESCANSO. Esto es un espacio en blanco, por lo que si el archivo se estuviera leyendo en la codificación correcta (UTF-8), 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 guardarla no tendrá todos los caracteres que necesita. Si PHP está leyendo el archivo con la codificación incorrecta, es muy probable que otros caracteres además de la lista de materiales se malinterpreten en silencio. Use UTF-8 en todas partes y estos problemas desaparecerán.


3

Puedes usar

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

Reemplazar con awk parece funcionar, pero no está en su lugar.


2

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


Use grep -rlI $'\xEF\xBB\xBF' .para ignorar archivos binarios. Y también .mejor que *aquí.
Nabi KAZ

2

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

Si usa PhpStorm , puede configurarlo en la tecla de acceso rápido para eliminarlo en Configuración -> Configuración IDE -> Mapa de teclas -> Menú principal -> Archivo -> Eliminar lista de materiales.



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 BOM" a "Codificación en UTF-8". Guarde y sobrescriba el archivo en su servidor.


1

Mismo problema, diferente solución.

Una línea en el 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, lo que resultó en 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\"?" . ">";

1

Si necesita poder eliminar la lista de materiales de los archivos codificados en UTF-8, primero debe buscar un editor que los conozca.

Yo 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 Marcador de orden de bytes si está seleccionado, vuelva a guardarlo y debería hacerlo.

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

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


1
El enlace de la imagen está roto.
Peter Mortensen

1

Puede abrirlo con PhpStorm y hacer clic derecho en su archivo y hacer clic en Eliminar lista de materiales ...


1

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

Una para encontrar la lista de materiales en un archivo y otra para MATAR a 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 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 te dice que hay BOM, ve y crea el segundo archivo .vbs con el siguiente código y arrastra el archivo sospechoso al 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 .


1

En PHPStorm, para múltiples archivos y BOM no necesariamente al comienzo del archivo, puede buscar \x{FEFF}(Expresión regular) y reemplazarlo por nada.


0

El mismo problema, pero solo afectó a un archivo, así que acabo de crear un archivo en blanco, copié / pegué el código del archivo original al nuevo archivo y luego reemplacé el archivo original. No es lujoso pero funcionó.



0

Yo tuve el mismo problema. El problema fue 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, tenía 2 soluciones diferentes que funcionaron para mí:

Primero, cambié la configuración de Apache usando AddDefaultCharsetDirective en los 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 codificación incorrecta del archivo php.


0
  1. Copie el texto de su archivo filename.css.
  2. Cierra tu archivo CSS.
  3. Cambie el nombre de filename2.css para evitar un choque 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 de las opciones de codificación.
  7. Cargue filename.css.

-3

Verifique su index.php, encuentre "... charset=iso-8859-1" y reemplácelo con "... charset=utf-8".

Quizás funcione.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.