Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

BOM et php...

11 réponses
Avatar
Denis Beauregard
Bonjour,

J'ai eu la réflexion suivante aujourd'hui.

Si j'écris une page .html qui est affichée telle quellr et
encodée en UTF8, avec le caractère BOM au début du fichier,
il est possible que ce caractère soit affiché et même cause
des problèmes.

Mais si j'écris une page .php, interprétée ensuite par PHP
sur le serveur, alors le caractère BOM est lu par PHP mais
ignoré à la sortie et utilisé seulement pour afficher le
bon jeu de caractère.

En d'autres mots, je n'ai pas à éliminer le BOM si j'édite
une page .php en UTF8, mais je dois le faire avec .htm et
.html car la page est normalement affichée telle quelle (donc
le BOM ne serait pas éliminé).

De plus, si je génère une page .html, pour en faire une page
statique, je ne dois pas non plus afficher le BOM.

J'ai bon ?


Denis

10 réponses

1 2
Avatar
Paul Gaborit
À (at) Wed, 01 Apr 2015 18:17:12 -0400,
Denis Beauregard écrivait (wrote):

J'ai eu la réflexion suivante aujourd'hui.

Si j'écris une page .html qui est affichée telle quellr et
encodée en UTF8, avec le caractère BOM au début du fichier,
il est possible que ce caractère soit affiché et même cause
des problèmes.

Mais si j'écris une page .php, interprétée ensuite par PHP
sur le serveur, alors le caractère BOM est lu par PHP mais
ignoré à la sortie et utilisé seulement pour afficher le
bon jeu de caractère.

En d'autres mots, je n'ai pas à éliminer le BOM si j'édite
une page .php en UTF8, mais je dois le faire avec .htm et
.html car la page est normalement affichée telle quelle (donc
le BOM ne serait pas éliminé).

De plus, si je génère une page .html, pour en faire une page
statique, je ne dois pas non plus afficher le BOM.

J'ai bon ?



Le bon conseil concernant l'UTF-8 est de ne pas utiliser de BOM ! Une
BOM ne sert à rien puisqu'il n'y a qu'un seul ordre possible pour les
octets.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Jean Francois Ortolo
Le 02/04/2015 02:10, Paul Gaborit a écrit :

À (at) Wed, 01 Apr 2015 18:17:12 -0400,
Denis Beauregard écrivait (wrote):

J'ai eu la réflexion suivante aujourd'hui.

Si j'écris une page .html qui est affichée telle quellr et
encodée en UTF8, avec le caractère BOM au début du fichier,
il est possible que ce caractère soit affiché et même cause
des problèmes.

Mais si j'écris une page .php, interprétée ensuite par PHP
sur le serveur, alors le caractère BOM est lu par PHP mais
ignoré à la sortie et utilisé seulement pour afficher le
bon jeu de caractère.

En d'autres mots, je n'ai pas à éliminer le BOM si j'édite
une page .php en UTF8, mais je dois le faire avec .htm et
.html car la page est normalement affichée telle quelle (donc
le BOM ne serait pas éliminé).

De plus, si je génère une page .html, pour en faire une page
statique, je ne dois pas non plus afficher le BOM.

J'ai bon ?



Le bon conseil concernant l'UTF-8 est de ne pas utiliser de BOM ! Une
BOM ne sert à rien puisqu'il n'y a qu'un seul ordre possible pour les
octets.




Bonjour

Le Bom, l'erreur classique qui cause d es problèmes ( fatals ), quand
on veut envoyer un header http ou autre au client...

Respectueusement.

Jean François Ortolo
Avatar
Olivier Miakinen
Bonjour,

Le 02/04/2015 00:17, Denis Beauregard a écrit :

Si j'écris une page .html qui est affichée telle quelle et
encodée en UTF8, avec le caractère BOM au début du fichier,
il est possible que ce caractère soit affiché et même cause
des problèmes.

Mais si j'écris une page .php, interprétée ensuite par PHP
sur le serveur, alors le caractère BOM est lu par PHP mais
ignoré à la sortie et utilisé seulement pour afficher le
bon jeu de caractère.

[...]

J'ai bon ?



À priori, ce serait plutôt l'inverse.

À moins que ça n'ait changé, l'interprèteur PHP envoie tel
quel tout caractère se trouvant en dehors des <?php et ?>, à
commencer par le BOM donc. Ainsi, que le BOM soit dans une
page .html ou .php, il sera envoyé au navigateur.

Souvent, ce BOM n'embête pas trop le navigateur, qui l'ignore.
En revanche, si dans PHP tu essayes d'envoyer des entêtes HTTP,
que ce soit par la fonction header() ou par d'autres fonctions,
eh bien c'est trop tard puisque le premier envoi d'un caractère,
fût-ce un BOM, déclenche l'envoi de tous les entêtes.

Il peut y avoir d'autres problèmes en PHP, par exemple si tu
inclus un fichier qui contient un BOM, car alors le BOM se
retrouvera au milieu de la page et non plus au début.

Quoi qu'il en soit, la seule attitude à avoir avec les BOM en
UTF-8, c'est de les éviter autant que possible : utiliser un
éditeur de texte qui ne les génère jamais, même par inadvertance.
Si tu dois être vigilant à chaque fois que tu sauves un fichier
pour choisir « UTF-8 sans BOM » plutôt que « UTF-8 avec BOM », et
que tu risques de te tromper, alors c'est un mauvais éditeur.

Cordialement,
--
Olivier Miakinen
Avatar
Otomatic
Olivier Miakinen <om+ écrivait :

Souvent, ce BOM n'embête pas trop le navigateur, qui l'ignore.
En revanche, si dans PHP tu essayes d'envoyer des entêtes HTTP,
que ce soit par la fonction header() ou par d'autres fonctions,
eh bien c'est trop tard puisque le premier envoi d'un caractère,
fût-ce un BOM, déclenche l'envoi de tous les entêtes.


Le moindre mal sera la présence de caractères « parasites » sur une ou
plusieurs pages HTML (générées par PHP), comme "" et, au pire, des
erreurs du style
Warning: Cannot modify header information - headers already sent by...

@Denis Beauregard :
X-Newsreader: Forte Agent 1.91/32.564


Costaud le « bestiau ». Ne n'aurais jamais pensé que la version 1.91
puisse encore fonctionner.
J'ai toujours dans mes archives une version 1.93 française.

Forte Agent, donc Windows, donc :
Beaucoup de logiciels Windows (incluant Notepad) ajoutent un BOM aux
fichiers UTF-8 si on n'y prend pas garde et ne préviennent pas, ni
n'indiquent le type d'encodage.
C'est pourquoi il est recommandé d'utiliser Notepad++
(Gratuit : http://notepad-plus.sourceforge.net/fr/site.htm)
qui indique, en bas de page, dans la barre d'état, diverses informations
dont le codage du fichier : ANSI, UTF-8 w/o BOM (C'est la version UTF-8
sans BOM), UTF-8 (C'est la version UTF-8 avec BOM), etc. et qui permet,
via le menu Encodage, de convertir d'un codage vers un autre.
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://aviatechno.net - Les anciens de Vilgénis
Avatar
Denis Beauregard
Le Wed, 01 Apr 2015 18:17:12 -0400, Denis Beauregard
écrivait dans
fr.comp.infosystemes.www.auteurs:

J'ai eu la réflexion suivante aujourd'hui.



Vos commentaires m'intriguent. C'est différent de ce que je pensais.

J'ai donc fait des tests.

Navigateurs :

SM: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101
Firefox/36.0 SeaMonkey/2.33.1
FF: 36.0.4
Chrome: Version 41.0.2272.118 m
MSIE: 9.0.8112.16421, 9.0.36

Fichier avec seulement le mot élégant


fichier .html avec BOM, lu directement
- pas d'effet (le BOM n'est pas affiché), texte en times

lu via PHP (127.0.0.1 sur mon ordi)
- pas d'effet, texte en times

fichier .php avec BOM, lu directement
- pas d'effet, texte en courrier
- MSIE ne veut pas afficher (il me demande si je veux ouvrir ou
enregistrer, et si c'est ouvrir, il ... l'ouvre dans l'éditeur
de texte, quel crétin)

lu via PHP (127.0.0.1 sur mon ordi)
- pas d'effet, texte en times

fichier .php normal, avec <head> et <body>
- pas d'effet, texte en times

fichier .php avec header:
<html>
<?php
header('Location: http://www.francogene.com/');
exit;
?>
- fonctionne comme prévu.

J'ai fait des tests avec 4 navigateurs et aucun n'a de problème
avec le BOM. Est-ce qu'avec un vieux navigateur ou un site web
(j'ai fait ces tests en local), il y aurait des problèmes ? C'est
à démontrer je pense.


Denis
Avatar
Olivier Miakinen
Le 02/04/2015 18:10, Denis Beauregard a écrit :

fichier .php avec header:
<html>
<?php
header('Location: http://www.francogene.com/');
exit;
?>
- fonctionne comme prévu.



Hein ???

Non seulement tu as le BOM au début de ton fichier, mais en plus tu as
les caractères '<', 'h', 't', 'm', 'l', '>' et saut de ligne !!! Tout
pour faire échouer l'envoi des entêtes.

Il faudra que tu écrives pour faire corriger la doc de PHP, car ton
exemple est exactement similaire à celui qui est explicitement donné
comme ne fonctionnant pas :

<cit. http://php.net/manual/fr/function.header.php>
========================================================== <html>
<?php
/* Ceci produira une erreur. Notez la sortie ci-dessus,
* qui se trouve avant l'appel à la fonction header() */
header('Location: http://www.example.com/');
exit;
?>
========================================================== </cit.>

Tiens-nous au courant !
Avatar
Denis Beauregard
Le Fri, 03 Apr 2015 00:59:18 +0200, Olivier Miakinen
<om+ écrivait dans fr.comp.infosystemes.www.auteurs:

Le 02/04/2015 18:10, Denis Beauregard a écrit :

fichier .php avec header:
<html>
<?php
header('Location: http://www.francogene.com/');
exit;
?>
- fonctionne comme prévu.



Hein ???

Non seulement tu as le BOM au début de ton fichier, mais en plus tu as
les caractères '<', 'h', 't', 'm', 'l', '>' et saut de ligne !!! Tout
pour faire échouer l'envoi des entêtes.

Il faudra que tu écrives pour faire corriger la doc de PHP, car ton
exemple est exactement similaire à celui qui est explicitement donné
comme ne fonctionnant pas :

<cit. http://php.net/manual/fr/function.header.php>
========================================================== ><html>
<?php
/* Ceci produira une erreur. Notez la sortie ci-dessus,
* qui se trouve avant l'appel à la fonction header() */
header('Location: http://www.example.com/');
exit;
?>
========================================================== ></cit.>

Tiens-nous au courant !



C'est pourtant le code que j'ai. Sur mon PC, donc en local,
malgré ce que dit la documentation, un fichier avec ce contenu
renvoie vers l'adresse indiquée.


Denis
Avatar
Denis Beauregard
Le Fri, 03 Apr 2015 00:59:18 +0200, Olivier Miakinen
<om+ écrivait dans fr.comp.infosystemes.www.auteurs:

Le 02/04/2015 18:10, Denis Beauregard a écrit :

fichier .php avec header:
<html>
<?php
header('Location: http://www.francogene.com/');
exit;
?>
- fonctionne comme prévu.



Hein ???

Non seulement tu as le BOM au début de ton fichier, mais en plus tu as
les caractères '<', 'h', 't', 'm', 'l', '>' et saut de ligne !!! Tout
pour faire échouer l'envoi des entêtes.

Il faudra que tu écrives pour faire corriger la doc de PHP, car ton
exemple est exactement similaire à celui qui est explicitement donné
comme ne fonctionnant pas :



Je viens de faire un nouveau test, cette fois-ci en recopiant mon
fichier sur mon serveur web et non plus en local. Et cette fois,
cela ne marche pas !!!

Warning: Cannot modify header information - headers already sent by
(output started at /home/***/public_html/test/test2.php:2) in
/home/***/public_html/test/test2.php on line 3

Donc, EasyPHP (en local) a un php.ini très permissif... En tous cas,
j'ai revérifié (même fichier) et cela fonctionne encore en local.


Denis
Avatar
JC_Et
*Bonjour*, Le 03/04/2015 02:28, Denis Beauregard a écrit :

Donc, EasyPHP (en local)


EasyPHP = Windows
Windows laisse tout passer. Ne fait m^me pas le différence entre
majuscules et minuscules ! donc BOM connait pas ;)

--
JC E.
Avatar
Otomatic
JC_Et écrivait :

Windows laisse tout passer. Ne fait m^me pas le différence entre
majuscules et minuscules ! donc BOM connait pas ;)


Windows ne laisse pas tout passer, ça dépend des paramètres de
configuration de PHP.
En local
- Windows 7 Pro 64 bit - Apache 2.4.12 - PHP 5.6.7
Si j'ai un fichier avec BOM ou si j'envoie un caractère avant les
header(..) PHP, j'ai bien :
Warning: Cannot modify header information - headers already sent by...

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont forcément raison. Coluche
1 2