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


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

PHP elimina todos los espacios en blanco, por lo que un azar ï"¿ en el medio del código estropea todo el asunto. 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 hay claramente algo está mal con la codificación de archivos, 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 gama de editores de texto. Sin embargo, realmente no sé mucho sobre codificación de caracteres, así que agradecería que me ayudaran.

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

Author: Peter Mortensen, 2010-07-15

22 answers

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. Tienes que decirle a tu 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 awk como se muestra en esta pregunta.

Como otra respuesta dice , lo mejor sería que PHP realmente interpretara la lista de materiales correctamente, para eso puede usar mb_internal_encoding(), like esto:

 <?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...
  ?>
 124
Author: Vinko Vrsalovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:32

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

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
 21
Author: Michael Schreiber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 17:00:24

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

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 ingrese el comando para eliminar la lista de materiales:

set nobomb

Guarde el archivo:

wq
 19
Author: Diego Palomar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:59:04

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

 15
Author: V.Rohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 17:18:15

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

Desde Eliminando la 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.

 11
Author: Eugene Yokota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 13:55:20

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

 6
Author: NickWebman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-12 18:53:33

No conozco PHP, así que no se 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 ANCHO CERO SIN ESPACIO DE INTERRUPCIÓN. Esto es espacio en blanco, por lo que si el archivo se lee en la codificación correcta (UTF-8), entonces la lista de materiales se interpretará como espacio en blanco y se ignorará en el archivo CSS resultante.

Además, otra ventaja de leer el archivo en la codificación correcta es que no tiene que preocuparse sobre personajes mal interpretados. Su editor le está diciendo que la página de códigos en la que desea guardarla no hará 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. Utilice UTF-8 en todas partes, y estos problemas desaparecen.

 5
Author: Jeffrey L Whitledge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-15 14:10:28

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

 3
Author: till,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:56:01

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

 2
Author: Simone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 14:13:23

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

Si usa PhpStorm puede configurar at hotkey para eliminarlo en Configuración -> Configuración del IDE -> Mapa de teclas -> Menú principal - > Archivo -> Eliminar lista de materiales.

 2
Author: Toby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:57:17

En Notepad++, elija el menú "Codificación", luego "Codificar en UTF-8 sin BOM". Entonces salva.

Consulte la pregunta de desbordamiento de pilaCómo hacer bloc de notas para guardar texto en UTF - 8 sin BOM?.

 2
Author: Curtis Yallop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:38

Abra el archivo PHP bajo pregunta, en Notepad++.

Haga clic en Encoding en la parte superior y cambie de "Encoding in UTF-8 without BOM" a solo "Encoding in UTF-8". Guarde y sobrescriba el archivo en su servidor.

 2
Author: Problem Solved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-21 06:55:54

Mismo problema, solución diferente.

Una línea en el archivo PHP estaba imprimiendo encabezados XML (que usan las mismas etiquetas begin/end que PHP). Parece que el código dentro de estas etiquetas establece la codificación, y se ejecutó dentro de PHP que resultó en 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\"?" . ">";
 1
Author: D G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-05 18:20:08

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

Yo personalmente uso E Editor de texto.

En la parte inferior derecha, hay opciones para la codificación de caracteres, incluida la etiqueta BOM. Cargue su archivo, deseleccione el marcador de orden de bytes si está seleccionado, vuelva a guardar y debe hacerlo.

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

E no es gratis, pero hay una prueba gratuita, y es un excelente editor (compatibilidad limitada TextMate ).

 1
Author: dmp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:52:55

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

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

Simplemente crea 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. Te 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 arrastre el archivo sospechos 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
Author: NoEs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 17:06:20

El mismo problema, pero solo afectó a un archivo, así que simplemente creé un archivo en blanco, copié/pegué el código del archivo original al nuevo archivo, y luego reemplazé el archivo original. No es elegante, pero funcionó.

 0
Author: jiminy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-30 20:39:43

Use Total Commander para buscar todos los archivos BOMed:

¿Una forma elegante de buscar archivos UTF-8 con BOM?

  • Abra estos archivos en algún editor apropiado (que reconozca la lista de materiales) como Eclipse .

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

  • Cortar ï"¿ desde el principio del archivo, guardar

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

...y ni siquiera pensar en usar n...¡d otra vez!

 0
Author: Jan Przybylo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:20

Puede abrirlo por PhpStorm y haga clic derecho en su archivo y haga clic en Eliminar BOM...

 0
Author: behtateam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:59:44

Yo tenía el mismo problema. El problema fue porque uno de mis archivos php estaba en utf-8 (el más importante, el archivo configuaration que está incluido en todos los archivos php).

En mi caso, tuve 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 utilizar la codificación correcta.

AddDefaultCharset ISO-8859-1

La segunda solución fue cambiar el mal codificación del archivo php.

 0
Author: SkaJess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-11 07:59:47
  1. Copie el texto de su nombre de archivo.archivo css.
  2. Cierra tu archivo css.
  3. Cámbiale el nombre de archivo 2.css para evitar un choque de nombres de archivo.
  4. En MS Notepad o Wordpad, cree un nuevo archivo.
  5. Pegue el texto en él.
  6. Guárdelo como nombre de archivo.css, seleccionando UTF-8 de las opciones de codificación.
  7. Sube el nombre del archivo.css.
 0
Author: Benjamin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 18:42:48

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

 0
Author: Guillaume Renoult,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 03:43:12

Comprueba tu index.php, encuentra "... charset=iso-8859-1 " y sustitúyalo por "... charset=utf-8".

Tal vez funcione.

 -3
Author: John Great,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 16:58:02