php - superdelete - ¿Cómo elimino ï »¿desde el comienzo de un archivo?
unlink php ejemplo (22)
Tengo un archivo CSS que se ve bien cuando lo abro usando gedit , pero cuando lo lee PHP (para fusionar todos los archivos CSS en uno), este CSS tiene los siguientes caracteres anexados a él: ï »¿
PHP elimina todos los espacios en blanco, por lo que un ï »¿al azar en el medio del código arruina todo el asunto. 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 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. Aunque no sé mucho sobre la codificación de caracteres, la ayuda será apreciada.
Si esto ayuda, el archivo se guardará en formato UTF-8, y gedit no me permitirá guardarlo en formato ISO-8859-15 (el documento contiene uno o más caracteres que no se pueden codificar utilizando la codificación de caracteres especificada). Traté de guardarlo con terminaciones de línea de Windows y Linux, pero ninguno me ayudó.
- Copie el texto de su archivo filename.css.
- Cierre su archivo css.
- Cambie el nombre filename2.css para evitar un conflicto de nombre de archivo.
- En MS Notepad o Wordpad, crea un nuevo archivo.
- Pega el texto en él.
- Guárdelo como filename.css, seleccionando UTF-8 de las opciones de codificación.
- Subir filename.css
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.
Abra su archivo en Notepad++ . En el menú Codificación , seleccione Convertir a UTF-8 sin BOM , guarde el archivo, reemplace el archivo anterior con este nuevo archivo. Y funcionará, malditamente seguro.
Aquí hay otra buena solución para el problema con BOM. Estos son dos scripts de VBScript (.vbs).
Uno 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 crea un archivo .vbs y pega 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 te dice que hay una BOM, ve y crea el segundo archivo .vbs con el siguiente código y arrastra el archivo suspicios 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 .
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 quitar BOM 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.
Compruebe en su index.php
, busque "... charset=iso-8859-1
" y reemplácelo por "... charset=utf-8
".
Quizás funcione.
El mismo problema, pero solo afectó un archivo, así que acabo de crear un archivo en blanco, copiar / pegar el código del archivo original al nuevo archivo, y luego reemplazar el archivo original. No es lujoso, pero funcionó.
En PHP , puede hacer lo siguiente para eliminar todos los caracteres que no sean, incluido el personaje en cuestión.
$response = preg_replace(''/[/x00-/x1F/x80-/xFF]/'', '''', $response);
En Notepad ++, elija el menú "Codificación", luego "Codificar en UTF-8 sin BOM". Entonces guarda.
Consulte Pregunta de desbordamiento de pila ¿ Cómo hacer que Notepad guarde el texto en UTF-8 sin BOM? .
En PHPStorm, para múltiples archivos y BOM no necesariamente al principio del archivo, puede buscar /x{FEFF}
(Expresión regular) y reemplazar por nada.
Mismo problema, diferente solución.
Una línea en el archivo PHP estaba imprimiendo 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 forma, aquí está la solución:
# Original
$xml_string = "<?xml version=/"1.0/" encoding=/"UTF-8/"?>";
# fixed
$xml_string = "<" . "?xml version=/"1.0/" encoding=/"UTF-8/"?" . ">";
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 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.
Para aquellos con acceso shell aquí hay un pequeño comando para encontrar todos los archivos con el BOM configurado en el directorio public_html - asegúrese de cambiarlo a cuál es 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
Y ingrese el comando para eliminar la lista de materiales:
set nobomb
Guarda el archivo:
wq
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...
Puede abrirlo por PhpStorm y hacer clic derecho en su archivo y hacer clic en Eliminar BOM ...
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.
Si necesita poder eliminar la lista de materiales de los archivos codificados en UTF-8, primero debe obtener un editor que esté al tanto de ellos.
Personalmente utilizo E Text Editor .
En la esquina 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.
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 ).
Tres palabras para ti:
Esa es la representación de la BOM UTF-8 en 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 remoción de la BOM puede usar awk
como se muestra en esta pregunta .
Como dice otra respuesta , lo mejor sería que PHP interpretara la BOM correctamente, para eso puedes 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...
?>
Use Total Commander para buscar todos los archivos BOMed:
¿Manera elegante de buscar archivos UTF-8 con BOM?
Abra estos archivos en algún editor adecuado (que reconozca la lista de materiales) como Eclipse .
Cambia la codificación del archivo a ISO (clic derecho, propiedades).
Cortar ï »¿desde el comienzo del archivo, guardar
Cambie la codificación del archivo a UTF-8
... ¡y ni siquiera pienses en usar n ... d otra vez!
Yo 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, 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 usar la codificación correcta.
AddDefaultCharset ISO-8859-1
La segunda solución fue cambiar la mala codificación del archivo php.
grep -rl $ ''/ xEF / xBB / xBF'' * | xargs vim -e -c ''argdo set fileencoding = utf-8 | set encoding = utf-8 | establecer nobomb | wq ''