Comment supprimer ï »¿du début d'un fichier?


145

J'ai un fichier CSS qui a l'air bien quand je l'ouvre avec gedit , mais quand il est lu par PHP (pour fusionner tous les fichiers CSS en un seul), ce CSS a les caractères suivants en préfixe: ï »¿

PHP supprime tous les espaces, donc un «aléatoire» au milieu du code gâche tout. Comme je l'ai mentionné, je ne peux pas vraiment voir ces caractères lorsque j'ouvre le fichier dans gedit, donc je ne peux pas les supprimer très facilement.

J'ai recherché le problème sur Google et il y a clairement quelque chose qui ne va pas avec le codage des fichiers, ce qui est logique étant donné que j'ai transféré les fichiers vers différents serveurs Linux / Windows via ftp et rsync , avec une gamme d'éditeurs de texte. Je ne connais pas vraiment beaucoup l'encodage des caractères, donc de l'aide serait appréciée.

Si cela aide, le fichier est enregistré au format UTF-8 et gedit ne me permettra pas de l'enregistrer au format ISO-8859-15 (le document contient un ou plusieurs caractères qui ne peuvent pas être encodés en utilisant l'encodage de caractères spécifié). J'ai essayé de l'enregistrer avec les fins de ligne Windows et Linux, mais aucun n'a aidé.


Cela semble résoudre le problème. 95isalive.com/expression/index.html

30
Quelqu'un nous dépouille de la nomenclature
David Heffernan

Réponses:


151

Trois mots pour vous:

Marque d'ordre d'octet (BOM)

C'est la représentation de la nomenclature UTF-8 dans ISO-8859-1. Vous devez dire à votre éditeur de ne pas utiliser les nomenclatures ou d'utiliser un autre éditeur pour les supprimer.

Pour automatiser la suppression de la nomenclature, vous pouvez utiliser awkcomme indiqué dans cette question .

Comme le dit une autre réponse , le mieux serait que PHP interprète correctement la nomenclature, pour cela, vous pouvez 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...
  ?>

Oui, j'ai trouvé ça quand je l'ai cherché sur Google, mais comment les supprimer?
Matt

10
Il ne supprime pas la nomenclature, il l'ignore.
Cole Johnson

Ou l'inverse (ignorer) pourrait être de changer l'encodage.
mr5

Windows Notepad (ugh) les ajoute; La suggestion d'un dup de cette question est d'utiliser Notepad ++, qui permet de définir "UTF-8 sans BOM" comme encodage. Ou utilisez un éditeur réel ... (emacs!) :-)
jesup

2
C'est exactement le problème, différents encodages de caractères utilisent des octets différents pour les mêmes caractères. Relisez le troisième paragraphe de la réponse.
Vinko Vrsalovic

24

Ouvrez votre fichier dans Notepad ++ . Dans le menu Codage , sélectionnez Convertir en UTF-8 sans BOM , enregistrez le fichier, remplacez l'ancien fichier par ce nouveau fichier. Et cela fonctionnera, sacrément sûr.


1
Dans Notepad ++ v7.6.6 (64 bits), vous devez cliquer sur Convertir en UTF-8 .
stomie

23

En 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);

1
au cas où vous voudriez juste tuer le "ï" utilisez ceci $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Vous ajoutez un extra /, il devrait être:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Pour ceux qui ont accès au shell, voici une petite commande pour trouver tous les fichiers avec la nomenclature définie dans le répertoire public_html - assurez-vous de le changer en ce que votre chemin correct sur votre serveur est

Code:

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

et si vous êtes à l'aise avec l' éditeur vi , ouvrez le fichier dans vi:

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

Et entrez la commande pour supprimer la nomenclature:

set nobomb

Enregistrez le fichier:

wq

1
Utilisez grep -rlI $'\xEF\xBB\xBF' .pour ignorer les fichiers binaires.
Nabi KAZ

11

La nomenclature n'est qu'une séquence de caractères ($ EF $ BB $ BF pour UTF-8), supprimez-les simplement à l'aide de scripts ou configurez l'éditeur pour qu'il ne soit pas ajouté.

À partir de la suppression de la nomenclature de UTF-8 :

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

Je suis sûr que cela se traduit facilement en PHP.


6
Notez que la nomenclature n'est pas une séquence de caractères, c'est un seul caractère. Si le fichier est en UTF-8, le caractère est représenté sur trois octets . Si le fichier est en UTF-8, le visualiser dans un autre codage (c'est-à-dire dans lequel EF BB BF apparaît à l'endroit où devrait se trouver la nomenclature) est une erreur. Pour supprimer la nomenclature d'un fichier UTF-8, il faut supprimer le (unique) caractère U + FEFF. Ouais, pédanterie!
Jeffrey L Whitledge

1
Je ne pouvais pas faire fonctionner cela en PHP (c'est juste mon incompétence, pas la vôtre: P), alors j'ai vérifié si la nomenclature est là et supprimez les 3 premiers caractères. Voici le code, si quelqu'un en a besoin: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
cela se traduit par php comme $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. avant de l'utiliser, reconsidérez si vous ne pouvez pas résoudre le problème à la source à la place.
commonpike

6

Pour moi, cela a fonctionné:

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

Si je supprime cette méta, le ï »¿réapparaît. J'espère que cela aide quelqu'un ...


5

Je ne connais pas PHP, donc je ne sais pas si cela est possible, mais la meilleure solution serait de lire le fichier en UTF-8 plutôt qu'en un autre encodage. La nomenclature est en fait un ZERO WIDTH NO BREAK SPACE. Il s'agit d'un espace blanc, donc si le fichier était lu dans le bon encodage (UTF-8), alors la nomenclature serait interprétée comme un espace blanc et elle serait ignorée dans le fichier CSS résultant.

En outre, un autre avantage de la lecture du fichier dans le bon encodage est que vous n'avez pas à vous soucier des caractères mal interprétés. Votre éditeur vous dit que la page de codes dans laquelle vous souhaitez l'enregistrer ne fera pas tous les caractères dont vous avez besoin. Si PHP lit alors le fichier avec un encodage incorrect, il est très probable que d'autres caractères que la nomenclature soient mal interprétés en silence. Utilisez UTF-8 partout et ces problèmes disparaissent.


3

Vous pouvez utiliser

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

Le remplacement par awk semble fonctionner, mais il n'est pas en place.


2

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


Utilisez grep -rlI $'\xEF\xBB\xBF' .pour ignorer les fichiers binaires. Et aussi .mieux alors *ici.
Nabi KAZ

2

J'ai eu le même problème avec la nomenclature apparaissant dans certains de mes fichiers PHP (ï »¿ï» ¿).

Si vous utilisez PhpStorm, vous pouvez définir un raccourci clavier pour le supprimer dans Paramètres -> Paramètres IDE -> Keymap -> Menu principal -> Fichier -> Supprimer la nomenclature.



2

Ouvrez le fichier PHP en question, dans Notepad ++.

Cliquez sur Encodage en haut et passez de «Encodage en UTF-8 sans BOM» à simplement «Encodage en UTF-8». Enregistrez et écrasez le fichier sur votre serveur.


1

Même problème, solution différente.

Une ligne du fichier PHP imprimait des en-têtes XML (qui utilisent les mêmes balises de début / fin que PHP). On dirait que le code de ces balises a défini l'encodage et a été exécuté dans PHP, ce qui a entraîné des caractères étranges. Dans tous les cas, voici la solution:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

Si vous avez besoin de pouvoir supprimer la nomenclature des fichiers encodés en UTF-8, vous devez d'abord vous procurer un éditeur qui en a connaissance.

J'utilise personnellement E Text Editor .

En bas à droite, il existe des options pour le codage des caractères, y compris la balise BOM. Chargez votre fichier, désélectionnez Byte Order Marker s'il est sélectionné, réenregistrez, et cela devrait être fait.

Texte alternatif http://oth4.com/encoding.png

E n'est pas gratuit, mais il existe un essai gratuit, et c'est un excellent éditeur ( compatibilité TextMate limitée ).


1
Le lien image est rompu.
Peter Mortensen

1

Vous pouvez l'ouvrir par PhpStorm et faire un clic droit sur votre fichier et cliquer sur Supprimer la nomenclature ...


1

Voici une autre bonne solution au problème de la nomenclature. Ce sont deux scripts VBScript (.vbs).

Un pour trouver la nomenclature dans un fichier et un pour TUER la fichue nomenclature dans le fichier. Cela fonctionne assez bien et est facile à utiliser.

Créez simplement un fichier .vbs et collez-y le code suivant.

Vous pouvez utiliser le script VBScript simplement en faisant glisser et en déposant le fichier suspect sur le fichier .vbs. Il vous dira s'il existe une nomenclature ou non.

' 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 indique qu'il existe une nomenclature, créez le deuxième fichier .vbs avec le code suivant et faites 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 .


1

Dans PHPStorm, pour plusieurs fichiers et nomenclatures pas nécessairement au début du fichier, vous pouvez rechercher \x{FEFF}(Expression régulière) et remplacer par rien.


0

Même problème, mais cela n'a affecté qu'un seul fichier, j'ai donc simplement créé un fichier vierge, copié / collé le code du fichier d'origine dans le nouveau fichier, puis remplacé le fichier d'origine. Pas de fantaisie mais ça a marché.



0

J'ai eu le même problème. Le problème était que l'un de mes fichiers php était dans utf-8 (le plus important, le fichier de configuration qui est inclus dans tous les fichiers php).

Dans mon cas, j'avais 2 solutions différentes qui ont fonctionné pour moi:

Tout d'abord, j'ai changé la configuration Apache en utilisant AddDefaultCharsetDirective dans les fichiers de configuration (ou dans .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.


0
  1. Copiez le texte de votre fichier filename.css.
  2. Fermez votre fichier css.
  3. Renommez-le filename2.css pour éviter un conflit de nom de fichier.
  4. Dans MS Notepad ou Wordpad, créez un nouveau fichier.
  5. Collez-y le texte.
  6. Enregistrez-le sous nomfichier.css, en sélectionnant UTF-8 parmi les options d'encodage.
  7. Téléchargez filename.css.

-3

Vérifiez votre index.php, trouvez "... charset=iso-8859-1" et remplacez-le par "... charset=utf-8".

Peut-être que ça marchera.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.