Comment puis-je supprimer les ï"¿ du début d'un fichier?
j'ai un fichier CSS qui a l'air bien quand je l'ouvre en utilisant gedit , mais quand il est lu par PHP( pour fusionner tous les fichiers CSS en un seul), ce CSS a les caractères suivants préprogrammés à elle: ï " ¿
PHP supprime tous les espaces blancs, donc un aléatoire ï " ¿au milieu du code gâche toute la chose. Comme je l'ai mentionné, Je ne peux pas réellement voir ces caractères lorsque j'ouvre le fichier dans gedit, donc je ne peux pas les supprimer très facilement.
j'ai googlé le problème, et il y a clairement quelque chose qui ne va pas avec l'encodage du fichier, ce qui est logique étant donné que j'ai déplacé les fichiers autour de différents serveurs Linux/Windows via ftp et rsync , avec une gamme d'éditeurs de texte. Je ne sais pas grand chose à propos de l'encodage des caractères, donc de l'aide serait appréciée.
si cela aide, le fichier est sauvegardé au format UTF-8, et gedit ne me laissera pas le sauvegarder au format ISO-8859-15 (le document contient un ou plusieurs caractères qui ne peuvent pas être encodés en utilisant le codage de caractères spécifié). J'ai essayé de le sauvegarder avec les terminaisons des lignes Windows et Linux, mais ni l'un ni l'autre n'a aidé.
22 réponses
trois mots pour vous:
Marque d'Ordre des Octets (BOM)
c'est la représentation pour le BOM UTF-8 dans ISO-8859-1. Vous devez indiquer à votre éditeur de ne pas utiliser les Nomenclatures ou utiliser un autre éditeur de bande.
pour automatiser la suppression du BOM vous pouvez utiliser awk
comme indiqué dans cette question .
comme une autre réponse dit , le mieux serait que PHP interprète effectivement le BOM correctement, pour que vous puissiez utiliser mb_internal_encoding()
, comme ceci:
<?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...
?>
dans PHP , vous pouvez faire ce qui suit pour supprimer tous les non caractères, y compris le caractère en question.
$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
pour ceux qui ont accès à l'interpréteur de commandes voici une petite commande pour trouver tous les fichiers dont le BOM est défini dans le répertoire public_html - assurez-vous de le modifier en fonction de votre chemin correct sur votre serveur
Code:
grep -rl $'\xEF\xBB\xBF' /home/username/public_html
et si vous êtes à l'aise avec l'éditeur vi , ouvrez le fichier en vi:
vi /path-to-file-name/file.php
et entrer la commande pour supprimer le BOM:
set nobomb
Save le dossier:
wq
BOM est juste une séquence de caractères ($EF $BB $BF pour UTF-8), alors il suffit de les supprimer en utilisant des scripts ou configurer l'éditeur pour qu'il ne soit pas ajouté.
à Partir de Retrait BOM UTF-8 :
#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);
je suis sûr qu'il se traduit en PHP facilement.
pour moi, cela a fonctionné:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
si je supprime ce méta, le ï " ¿apparaît de nouveau. Espérons que cela aide quelqu'un...
Je ne connais pas PHP, donc je ne sais pas si c'est possible, mais la meilleure solution serait de lire le fichier en UTF-8 plutôt qu'un autre encodage. Le BOM est en fait une largeur zéro sans espace de pause. C'est un espace blanc, donc si le fichier était lu dans le bon encodage (UTF-8), alors le BOM serait interprété comme un espace blanc et il serait ignoré dans le fichier CSS résultant.
aussi, un autre avantage de lire le fichier dans le codage correct est que vous ne vous inquiétez pas si les personnages sont mal interprétés. Votre éditeur vous dit que la page de code que vous voulez sauvegarder ne fera pas tous les caractères dont vous avez besoin. Si PHP lit alors le fichier dans le codage incorrect, alors il est très probable que d'autres caractères que le BOM sont silencieusement mal interprétés. Utilisez UTF-8 partout, et ces problèmes disparaissent.
vous pouvez utiliser
vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'
Remplacement avec awk semble fonctionner, mais il n'est pas en place.
grep-RL $ '\xEF\xBB\xBF '* / xargs vim -e-c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'
dans le bloc-notes++, choisissez le menu" encodage", puis"Encoder en UTF-8 sans BOM". Puis enregistrez.
Voir Débordement de Pile question Comment faire pour que le bloc-notes pour enregistrer le texte en UTF-8 sans BOM? .
ouvrir le fichier PHP sous question, dans Notepad++.
cliquez sur Encoding en haut et passez de "Encoding in UTF-8 without BOM" à "Encoding in UTF-8". Enregistrer et enregistrez le fichier sur votre serveur.
même problème, solution différente.
une ligne dans le fichier PHP était l'impression des en-têtes XML (qui utilisent les mêmes balises begin/end que PHP). On dirait que le code dans ces tags a défini l'encodage, et a été exécuté dans PHP qui a donné les caractères étranges. En tout cas, voici la solution:
# Original
$xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";
si vous devez être en mesure de supprimer le BOM des fichiers encodés UTF-8, vous devez d'abord mettre la main sur un éditeur qui est au courant d'eux.
personnellement, j'utilise E Éditeur de Texte .
en bas à droite, il y a des options pour l'encodage des caractères, y compris la balise BOM. Chargez votre fichier, désélectionnez le marqueur D'Ordre des octets s'il est sélectionné, résavez, et cela doit être fait.
Alt text http://oth4.com/encoding.png
E n'est pas libre, mais il ya un essai gratuit, et il est un excellent éditeur (limitée TextMate compatibilité).
Voici une autre bonne solution pour le problème avec BOM. Il s'agit de deux VBScript (.vbs) les scripts.
un pour avoir trouvé le BOM dans un fichier et un pour avoir tué le damné BOM dans le fichier. Il fonctionne très bien et est facile à utiliser.
il suffit de créer un .vbs fichier et collez le code suivant dans.
vous pouvez utiliser le script VBScript simplement en faisant glisser et en laissant tomber le fichier suspect sur le .vbs fichier. Il vous dira s'il y a un BOM ou pas.
' 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
S'il vous dit QU'il y a BOM, allez créer le second .VBS fichier avec le code suivant et faire glisser le fichier suspicios sur le .fichier 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
le code est de Heiko Jendreck .
même problème, mais il n'a affecté qu'un seul fichier donc je viens de créer un fichier vierge, copier/coller le code à partir du fichier original vers le nouveau fichier, puis a remplacé le fichier original. Pas de fantaisie, mais cela a fonctionné.
Utiliser Total commander à la recherche pour tous les BOMed fichiers:
élégante façon de rechercher des fichiers UTF-8 avec BOM?
-
ouvrez ces fichiers dans un éditeur approprié (qui reconnaît BOM) comme Eclipse .
-
changez l'encodage du fichier EN ISO (clic droit, Propriétés).
-
Couper ï"¿ à partir du début du fichier, enregistrer
-
modifier l'encodage du fichier retour à UTF-8
...et ne pensez même pas à utiliser N...d encore une fois!
j'ai eu le même problème. Le problème était que l'un de mes fichiers php était en utf-8 (le plus important, le fichier de configuration qui est inclus dans tous les fichiers php).
dans mon cas, j'ai eu 2 solutions différentes qui ont fonctionné pour moi:
tout d'abord, j'ai modifié la Configuration D'Apache en utilisant AddDefaultCharsetDirective dans les fichiers de configuration (ou in .htaccess). Cette solution oblige Apache à utiliser le bon encodage.
AddDefaultCharset ISO-8859-1
la deuxième solution était de changer le mauvais encodage du fichier php.
- Copiez le texte de votre nom de fichier.fichier css.
- fermez votre fichier css.
- le renommer filename2.css pour éviter un nom de fichier clash.
- dans MS Notepad ou Wordpad, créez un nouveau fichier.
- Coller le texte.
- Enregistrer sous nom de fichier.CSS, en sélectionnant UTF-8 à partir des options d'encodage.
- Upload de fichier.CSS.
dans PHPStorm, pour plusieurs fichiers et BOM pas nécessairement au début du fichier, vous pouvez rechercher \x{FEFF}
(Expression régulière) et remplacer par rien.
le contrôle de votre index.php
, trouver "... charset=iso-8859-1
"et le remplacer par"... charset=utf-8
".
peut-être que ça marchera.