Bonjour,

j'ai un vieux site qui bien que sous PHP 7 est en iso-8859-1.
Ce serait trop de boulot de le convertir en UTF-8.
Tous les scripts PHP commencent donc par :

header ('Content-Type: text/html; charset=ISO-8859-1');

A la base, le site en XHTML script :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="content-Type" content="text/html; charset=iso-8859-1" />
etc.

Et tout va bien...

Si je veux passer en html 5

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="iso-8859-1" />
etc.

Les pages s'affichent très bien mais le validateur du W3C me crache une série d'erreurs.

Warning: Using windows-1252 instead of the declared encoding iso-8859-1.
Warning: Legacy encoding windows-1252 used. Documents should use UTF-8.
Error: Bad value iso-8859-1 for attribute charset on element meta: iso-8859-1 is not a preferred encoding name. The preferred label for this encoding is windows-1252.

Je peux rester en XHTML mais voyez-vous comment je pourrais passer en HTML 5 sans me prendre tous ces messages d'erreur ?

Merci d'avance.
Modérateur
windows-1252 est une modification de iso-8859-1 qui remplace certains caractères de contrôles qui ne servent plus à rien (utilisés autrefois par certains appareils, principalement des imprimantes) par des symboles utiles: € ou œ par exemple.

De fait iso-8859-1 ne fait plus partie de la liste d'encodages que les navigateurs sont censés supporter, c'est windows-1252 désormais. => https://encoding.spec.whatwg.org/#names-and-labels

Utilisez donc cet encodage. Dans vos en-têtes et dans la balise meta.
Modifié par kustolovic (14 Jan 2018 - 21:58)
Bonjour,

Merci, de ta réponse.

Quand je vois marqué Windows je m'attends à une montage de bugs...

Je vais essayer cet encodage, je te tiens informé.
Merci pour billet.

Autrement après :
<meta charset="windows-1252" />

Il me reste une seule erreur :
Error 3 29 Internal encoding declaration “windows-1252” disagrees with the actual encoding of the document (“utf-8”)

Qu'est-ce qui est encodé UTF-8 ? Je me le demande... Le script ?

Pas le temps de voir ce soir mais je reviens vers vous.
Modifié par boteha_2 (14 Jan 2018 - 22:18)
Bonjour,

boteha_2 a écrit :

Il me reste une seule erreur :
Error 3 29 Internal encoding declaration “windows-1252” disagrees with the actual encoding of the document (“utf-8”)


J'ai vérifié avec Norepad++, mes scripts sont enregistrés en ANSI avec retours à la ligne Windows.

Où le validateur du W3C trouve-t-il un encodage UTF-8 ?
Je rappelle que le site est en PHP 7.2.
Modérateur
Bonjour,

boteha_2 a écrit :
Où le validateur du W3C trouve-t-il un encodage UTF-8 ?
Je rappelle que le site est en PHP 7.2.


Le charset peut éventuellement être imposé par le serveur quelque soit le contenu des pages. Le charset peut aussi être imposé via une directive dans un .htaccess. Juste des hypothèses à vérifier.

Amicalement,
Bonjour,

Tous les scripts PHP commencent par :

header ('Content-Type: text/html; charset=ISO-8859-1');

Peut-êlre là aussi faut-il mettre windows-1252 ?

Il n'y a rien dans le htaccess, il me semble que PHP 7.2 est en UTF-8 par défaut.

Pour les tests, j'utilise la console Firefiox avec html-validator ou le test W3C public.

Une URL à tester sur le site de développement, celui en production est encore en XHTML.
Modérateur
L'URL donne bien l'erreur suivante:

Using windows-1252 instead of the declared encoding iso-8859-1.

Il faut envoyer windows-1252 dans l'en-tête aussi (et surtout en fait, l'en-tête écrase la balise meta)

Le message UTF-8 vient peut-être de l'extension, certaines envoient en utf-8 au validateur (c'est ballot, oui)
Bonjour,

Je découvre seulement maintenant ta réponse, je n'ai pas reçu la notification par mail.

Je vais donc essayer au niveau du PHP :

header ('Content-Type: text/html; charset=windows-1252');

Je vous tiens informés dès que c'est fait.

Autrement, de quelle extension parles-tu ?
Bonjour,

Dans PHP :
header ('Content-Type: text/html; charset=windows-1252');

Dans HTML :
<meta charset="windows-1252" />

Je me prends toujours le même warning du W3C :

Warning: Legacy encoding windows-1252 used. Documents should use UTF-8.

Pas un drame mais un peu énervant.
Bonjour,

Finalement j'ai décidé de passer en UTF-8 en supposant que cela apprécié par Google.

De mémoire, sachant que le site en PHP 7.2 est par défaut codé en UTF-8

1) Recoder tous les scripts d'ANSI vers UTF-8 sans DOM avec Notepad++.

2) Indiquer UTF-8 à toutes les fonctions pour lesquelles il faut spécifier un jeu de caractères : html_entities () par exemple.

3) Passer en mb pour certaines fonctions de chaînes : strlen, strpos.

4) Coder les champs textes de le BD en UTF-8.

Un gros boulot.

N'ai-je rien oublié ?

J'ai fait un test avec un script enregistré en UTF-8 :

<?php

$str = 'aéô';

echo '<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<title>Essai UTF-8</title>
</head>
<body>
<p>';

echo mb_detect_encoding ($str);
echo '<br>' . "\n";
echo $str;
echo '<br>' . "\n";
echo mb_strlen ($str);
echo '<br>' . "\n";
echo mb_strpos ($str, 'ô');

echo '</p>
</body>
</html>';

?>


Cela retourne correctement :

UTF-8
aéô
3
2

Devoir changer toutes les fonctions de chaînes avec le préfixe mb_, je trouve cela terrifiant...

Mais j'utilise beaucoup les entités html et très peu de scripts vont manipuler des caractères sur 2 bits.

Je suppose que je peut rester avec strlen () et strpos () si je suis sûr qu'il ne peut pas y avoir de caractères à 2 bits dans le script.
Modifié par boteha_2 (08 Jul 2018 - 14:42)
Bonjour,

Je suis passé en UTF-8.

Gros boulot.

Très bonne surprise, le n'ai pas eu besoin de toucher à ma base SQL dont les champs texte restent en latin_swedish.

Il suffit de préciser à chaque connexion :

mysqli_set_charset ($connexion, 'utf8');


Soit une seule ligne à ajouter dans la fonction de connexion.