Pregunta

Tengo un archivo CSS que se ve bien cuando he abierto el uso de gedit, pero cuando es leído por PHP (para combinar todos los archivos CSS en uno), CSS tiene los siguientes caracteres antepone a ella:ï"¿

PHP elimina todos los espacios en blanco, por lo que un azar ï"¿ en el medio de el código se mete toda la cosa.Como ya he mencionado, realmente no puedo ver a estos personajes cuando abro el archivo en gedit, así que no se puede quitar muy fácilmente.

Busqué en google el problema, y es evidente que hay algo mal con la codificación de archivo, lo que hace que el sentido de ser como he ido cambiando los archivos en torno a diferentes Linux/Windows servidores a través de ftp y rsync, con una variedad de editores de texto.Yo realmente no sé mucho acerca de la codificación de caracteres, así que la ayuda sería apreciada.

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 la codificación de caracteres especificada).He intentado guardarlo con Windows y Linux finales de línea, pero no nos ha ayudado.

¿Fue útil?

Solución

Tres palabras para usted:

MARCA DE PEDIDO DE BYTE (BOM)

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

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

como Otra respuestadice , lo mejor sería que PHP interprete realmente la BOM correctamente, ya que puedes usar mb_internal_encoding() , como este:

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

Otros consejos

Abra su archivo en Notepad ++ .Del menú codificación , seleccione convertir a UTF-8 sin BOM , guardar el archivo, reemplace el archivo antiguo con este nuevo archivo.Y funcionará, maldita sea.

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

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

Para aquellos con acceso de shell aquí es un pequeño comando para encontrar todos los archivos con el conjunto de BOM en el directorio public_html, asegúrese de cambiarlo a lo que su ruta correcta en su 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 ingrese el comando para eliminar el BOM:

set nobomb

Guardar el archivo:

wq

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

de Eliminación de la BOM de UTF-8 :

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

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

para mí, esto funcionó:

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

Si elimino esta meta, aparece la ï ».Espero que esto ayude a alguien ...

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 BOM es en realidad un ancho cero sin espacio de descanso.Esto es espacial en blanco, por lo que si el archivo se leía en la codificación correcta (UTF-8), entonces la BOM se interpretaría como espacio en blanco y se ignoraría en el archivo CSS resultante.

Además, otra ventaja de leer el archivo en la codificación correcta es que no tiene que preocuparse por que los personajes sean malinterpretados.Su editor le está diciendo que la página de códigos con la que desea guardarlo no haga a todos los caracteres que necesita.Si PHP está leyendo el archivo en la codificación incorrecta, es muy probable que otros caracteres además de la BOM se estén malinterpretados en silencio.Utilice UTF-8 en todas partes, y estos problemas desaparecen.

puedes usar

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

Reemplazo con AWK parece funcionar, pero no está en su lugar.

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

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

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

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

Ver pregunta de desbordamiento de pila ¿Cómo hacer que el Bloc de notas guarde texto en UTF-8 sin BOM?.

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

Mismo problema, diferente solución.

Una línea en el archivo PHP estaba imprimiendo encabezados XML (que usan las mismas etiquetas de inicio/fin que PHP).Parece que el código dentro de estas etiquetas estableció la codificación y se ejecutó en 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\"?" . ">";

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

Yo personalmente uso Editor de texto electrónico.

En la parte inferior derecha, hay opciones para la codificación de caracteres, incluida la etiqueta BOM.Cargue su archivo, anule la selección del Marcador de orden de bytes si está seleccionado, vuelva a guardarlo y estará listo.

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

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

Puedes abrirlo por PHPStorm y haga clic derecho en su archivo y haga clic en Eliminar lista de materiales...

Aquí hay otra buena solución para el problema con BOM.estos son dos VBScript (.vbs) secuencias de comandos.

Uno para encontrar la BOM en un archivo y otro para MATAR la maldita BOM 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 utilizar 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 le indica que hay una lista de materiales, cree el segundo archivo .vbs con el siguiente código y arrastre 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.

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

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

Usar Comandante total para buscar todos los archivos BOMed:

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

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

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

  • Cortar  desde el principio del archivo, guardar

  • Cambie la codificación del archivo nuevamente a UTF-8

...¡y ni se te ocurra volver a utilizar n...d!

Yo tuve el mismo problema.El problema se debió a que 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 utilizar la codificación correcta.

AddDefaultCharset ISO-8859-1

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

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

revisa tu index.php, encontrar "... charset=iso-8859-1" y sustituirlo por "... charset=utf-8".

Quizás funcione.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top