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), ce CSS a les caractéristiques suivantes: caractères ajoutés à cela: ï "¿
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 réellement voir ces caractères lorsque j'ouvre le fichier dans gedit, je ne peux donc pas les supprimer très facilement.
J'ai googlé le problème, et il y a clairement un problème avec l'encodage de fichier, ce qui est logique car je déplace les fichiers sur différents serveurs Linux/Windows via ftp et rsync , avec une plage des éditeurs de texte. Cependant, je ne connais pas grand chose au codage de caractères, alors toute aide serait la bienvenue.
Si cela vous aide, le fichier est enregistré au format UTF-8 et gedit ne me permet pas de le sauvegarder au format ISO-8859-15 (le document contient un ou plusieurs caractères qui ne peuvent pas être codés à l'aide du codage de caractères spécifié). J'ai essayé de l'enregistrer avec les fins de ligne Windows et Linux, mais cela ne m'a pas aidé.
Trois mots pour vous:
C'est la représentation de la nomenclature UTF-8 dans ISO-8859-1. Vous devez dire à votre éditeur de ne pas utiliser de nomenclatures ou d'utiliser un autre éditeur pour les supprimer.
Pour automatiser la suppression de la nomenclature, vous pouvez utiliser awk
comme indiqué dans cette question .
Comme ne autre réponse dit , le mieux serait que PHP interprète correctement la nomenclature correctement, 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...
?>
Dans PHP , vous pouvez procéder comme suit pour supprimer tous les caractères autres que le caractère en question.
$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);
Ouvrez votre fichier dans Notepad ++ . Dans le menu Encodage , sélectionnez Convertir en UTF-8 sans nomenclature , sauvegardez le fichier, remplacez l’ancien fichier par ce nouveau fichier. Et ça va marcher, sacrément.
Pour ceux qui ont un accès 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 pour indiquer le 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 dans vi:
vi /path-to-file-name/file.php
Et entrez la commande pour supprimer la nomenclature:
set nobomb
Enregistrez le fichier:
wq
BOM est juste une séquence de caractères ($ EF $ BB $ BF pour UTF-8), donc supprimez-les simplement à l'aide de scripts ou configurez l'éditeur pour qu'il ne soit pas ajouté.
De 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 par PHP.
Pour moi, cela a fonctionné:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Si je supprime cette méta, le ï "¿apparaît à nouveau. J'espère que ça aide quelqu'un ...
Je ne connais pas PHP, donc je ne sais pas si cela est possible, mais la meilleure solution serait de lire le fichier au format UTF-8 plutôt qu’un autre encodage. La nomenclature est en fait un espace nul, sans largeur. Il s’agit d’un espace; ainsi, si le fichier était lu avec le codage correct (UTF-8), la nomenclature serait interprétée comme un espace et serait ignorée dans le fichier CSS résultant.
En outre, un autre avantage de la lecture du fichier dans le codage correct est que vous n'avez pas à vous soucier de la mauvaise interprétation des caractères. Votre éditeur vous indique que la page de code dans laquelle vous souhaitez l'enregistrer ne comportera pas tous les caractères dont vous avez besoin. Si PHP lit alors le fichier avec un codage incorrect, il est fort 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.
Vous pouvez utiliser
vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'
Remplacer par awk semble fonctionner, mais il n'est pas en place.
J'ai eu le même problème avec la nomenclature figurant dans certains de mes fichiers PHP (ï "¿ï" ¿).
Si vous utilisez PhpStorm , vous pouvez configurer le raccourci clavier pour le supprimer dans Paramètres -> IDE Paramètres -> Keymap -> Menu principal -> Fichier -> Supprimer la nomenclature.
Dans Notepad ++, choisissez le menu "Encodage", puis "Encoder en UTF-8 sans nomenclature". Puis enregistrez.
Voir la question relative au débordement de pile Comment créer un bloc-notes pour enregistrer du texte au format UTF-8 sans nomenclature?.
grep -rl $ '\ xEF\xBB\xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | set nobomb | wq '
Ouvrez le fichier PHP sous question, dans Notepad ++.
Cliquez sur Encodage en haut et remplacez "Encodage en UTF-8 sans nomenclature" par "Encodage en UTF-8". Enregistrez et écrasez le fichier sur votre serveur.
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 ne rien remplacer.
Si vous devez pouvoir supprimer la nomenclature des fichiers codés UTF-8, vous devez tout d'abord vous procurer un éditeur qui en est conscient.
Personnellement, j'utilise E Text Editor .
En bas à droite, vous trouverez des options pour le codage des caractères, notamment la balise BOM. Chargez votre fichier, désélectionnez Byte Order Marker s'il est sélectionné, enregistrez à nouveau et cela devrait être fait.
Alt text http://oth4.com/encoding.png
E n’est pas gratuit, mais il existe un essai gratuit et c’est un excellent éditeur (compatibilité limitée TextMate ).
Même problème, solution différente.
Une ligne du fichier PHP imprimait des en-têtes XML (qui utilisaient les mêmes balises de début/fin que PHP). On dirait que le code dans ces balises définit l'encodage et qu'il a été exécuté dans PHP, ce qui a entraîné l'apparition de caractères étranges. De toute façon, voici la solution:
# Original
$xml_string = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";
Vous pouvez l’ouvrir par PhpStorm et cliquer avec le bouton droit de la souris sur votre fichier, puis cliquer sur Supprimer la nomenclature ...
Voici une autre bonne solution au problème de la nomenclature. Ce sont deux VBScript (.vbs) scripts.
Une pour trouver la nomenclature dans un fichier et une pour TUER la fichue nomenclature dans le fichier. Cela fonctionne très bien et est facile à utiliser.
Créez simplement un fichier .vbs et collez-y le code suivant.
Vous pouvez utiliser le script VBScript en faisant simplement glisser 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-le glisser 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 provient de Heiko Jendreck .
J'ai eu le même problème. Le problème était dû au fait qu'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'avais 2 solutions différentes qui fonctionnaient pour moi:
Tout d'abord, j'ai modifié la configuration d'Apache à l'aide de AddDefaultCharsetDirective dans les fichiers de configuration (ou .htaccess). Cette solution oblige Apache à utiliser le bon encodage.
AddDefaultCharset ISO-8859-1
La deuxième solution consistait à changer le mauvais encodage du fichier php.
Utilisez Total Commander pour rechercher tous les fichiers BOMed:
moyen élégant de rechercher des fichiers UTF-8 avec une nomenclature?
Ouvrez ces fichiers dans un éditeur approprié (qui reconnaît la nomenclature) comme Eclipse .
Modifiez le codage du fichier en ISO (clic droit, propriétés).
Couper ï "¿du début du fichier, sauvegarder
Remettez le codage du fichier en UTF-8.
... et ne pensez même pas à utiliser n ... d à nouveau!
Même problème, mais cela ne concernait qu'un fichier. Je viens de créer un fichier vierge, de copier/coller le code du fichier d'origine dans le nouveau fichier, puis de remplacer le fichier d'origine. Pas chic mais ça a marché.