IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Problématique UTF-8 / iso-8859-1 dans les regex [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut Problématique UTF-8 / iso-8859-1 dans les regex
    Bonjour à tous (et meilleurs voeux pour l'année 2010 !!)

    Je propose à votre sagacité les essais suivants que j'ai effectués après avoir lu quelques post sur ce forum et consulté des tutos à ce sujet mais sans vraiment trouver la réponse.

    Donc voici le problème: J'envoie à partir d'un formulaire (method post) un textarea représentant une phrase type news donc je voudrais que les accents et ponctuations soient autorisés.

    Voici les deux codes

    Le formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!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" lang="fr">
    <head>
    	<title>Mon forum</title> 
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Content-Language" content="fr" />
    </head>
    <body>
    	<form action = "verif.php" method="post">
    		<textarea name="phrase" col="50" rows="5"></textarea>
    		<input type="submit" name="envoyer" value="envoyer" />
    	</form>
    </body>
    </html>
    La page de verif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!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" lang="fr">
    <head>
    	<title>Mon forum</title> 
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Content-Language" content="fr" />
    </head>
    <body>
    	<?php
    		$texte = $_REQUEST['phrase'];
    		$comp = "/^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/";
    		echo $texte."<br />".$comp."<br />".preg_match($comp,$texte);
    	?>
    </body>
    </html>
    Les deux pages sont codées en UTF-8. Mais les résultats suivants s'affichent lorsque j'envoie le mot "futé" dans le textarea:
    futé // le mot futé est bien reçu
    /^[a-zA-Z0-9 ���������\'\.;:,!-\?]+$/ // la variable $comp de comparaison ne s'affiche pas correctement !!??
    0 // et plus fort le résultat du test est 0 alors que futé ne comporte pas de caractère interdit


    Je me suis dit que puisque $comp n'était pas affiché correctement le problème venait peut être de lui. J'ai donc codé $comp en utf-8 avant le test.

    verif.php devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <!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" lang="fr">
    <head>
    	<title>Mon forum</title> 
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Content-Language" content="fr" />
    </head>
    <body>
    	<?php
    		$texte = $_REQUEST['phrase'];
    		$comp = "/^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/";
    		$comp = utf8_encode($comp);
    		echo $texte."<br />".$comp."<br />".preg_match($comp,$texte);
    	?>
    </body>
    </html>
    et le résultat pour "futé" devient:
    futé
    /^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/
    1

    Cette fois $comp s'affiche correctement et le résultat du test est ok.
    Je suppose que c'est parce que PHP est configuré par défaut en ISO-8859-1 que l'on observe ces résultat et la nécessité de coder en UTF-8 la variable $comp ? Faut-il systématiquement codé les variables de comparaison lorsqu'il y a des accents dans les textes à comparer ? Ou y a-t-il une autre explications ?

    Je me suis amusé à faire ces deux mêmes essais avec les deux pages codées en ISO-8859-1 en modifiant la ligne suivante dans chaque page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    J'observe les résultats suivants:
    avec $comp non codé UTF-8:
    futé
    /^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/
    0

    avec $comp codé en UTF-8
    futé
    /^[a-zA-Z0-9 éèà çâêîôû\'\.;:,!-\?]+$/
    1


    Les résultats des tests sont les mêmes mais les affichages ne sont pas compris par les navigateurs puisque eux attendent de l'ISO-8859-1.

    En conclusion j'ai du mal à comprendre pourquoi le textarea semble toujours envoyer de l'UTF-8 puisque si je code pas $comp dans ce format la comparaison ne fonctionne pas et cela indépendamment du codage de la page. Bref je patauge ....

    Quelqu'un a-t-il une explication plus académique à me proposer ?

    A bientôt

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    rajoute le modifyer u à ta regExp
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Lorsque j'ajoute ce modificateur j'obtiens la réponse suivante pour une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $comp = "/^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/u";
    Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 13 in E:\wamp\www\essais_divers\verif.php on line 14

    voici le code complet de verif.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!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" lang="fr">
    <head>
    	<title>Mon forum</title> 
    	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    	<meta http-equiv="Content-Language" content="fr" />
    </head>
    <body>
    	<?php
    		$texte = $_REQUEST['phrase'];
    		$nom = $_REQUEST['nom'];
    		$comp = "/^[a-zA-Z0-9 éèàçâêîôû\'\.;:,!-\?]+$/u";
    		echo $texte."<br />".$comp."<br />".preg_match($comp,$texte);
    		echo "<hr>";
    		echo $nom."<br />".$comp."<br />".preg_match($comp,$nom);
    	?>
    </body>
    </html>
    et cela quelque soit le codage de la page iso-8859-1 ou utf-8.

    en continuant à fouiller aux niveau des codages de page, j'ai trouvé la norme iso-8859-15. Avec cette norme, les tests se déroulent correctement (sans avoir recours à l'encodage de $comp) et les affichages sont corrects également.

    Ben là j'comprends plus rien

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $comp = "#^[a-zA-Z0-9 éèàçâêîôû'.;:,!?-]+$#u";
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Non toujours la même erreur

    Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 13 in E:\wamp\www\essais_divers\verif.php on line 13

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    le fichier lui même est en utf8 ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    oui et j'ai la confirmation en ouvrant les Informations sur la page du menu Outils

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $texte="mklj321.0.0trzret";
    $comp = "#^[a-zA-Z0-9 éèàçâêîôû'.;:,!?]+$#u";
     ?>
    <head>
    </head>
    <body>
    <?php
    echo (preg_match($comp,$texte))?"ok":"ko";
    ?>
    </body>
    <html>
    Ce code fonctionne parfaitement bien avec mon fichier enregistré en utf8 sans BOM.
    A mon avis la chaine que tu passes devra etre convertie en utf-8 car ton serveur ne doit pas être paramètré en utf-8, ou alors mets un htaccess pour changer le defaultcharset
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Bonsoir SpaceFrog et merci de passer du temps sur mes problèmes métaphysiques

    J'ai essayé ton script qui me donne cette erreur
    Warning: preg_match() [function.preg-match]: Compilation failed: invalid UTF-8 string at offset 13 in C:\TRAVAIL\wamp\www\essais divers\expression regulieres\index6.php on line 9
    ko


    J'ai modifié dans PHPini la ligne defaut-charset pour mettre utf-8 au lieu de iso-8859-1, puis redémarré WAMP. J'obtiens la même erreur. C'est la bonne manip à faire ?
    Pour le htacces, je n'en connais pas encore le fonctionnement, je n'en suis pas encore arrivé là

    Le modificateur u n'est pas accepté pour une raison que j'ignore. Si j'enlève ce modificateur, le test se passe bien avec le defautcharset utf-8 ou iso-8859-1 dans PHPini mais cela me semble normal puisqu'on reste dans la même page. Donc peut importe le codage je pense. J'ai bon ?

    Mon problème se situe au niveau de l'échange de données entre deux pages et aujourd'hui, la seule parade que j'ai trouvée est d'encoder en utf8 la variable de comparaison avant le test. Il m'est impossible d'utiliser le modificateur u sans provoquer une erreur du type cité plus haut.
    Si j'analyse bien le problème, la variable transmise est bien en utf-8 mais la variable de comparaison initialisée dans la page de vérification ne l'est pas. Ce qu'on peut vérifier en l'affichant comme expliqué dans mon premier post. Pourtant mes deux page comportent le meta suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    En fait sans savoir vraiment pourquoi, j'arrive à contourner le problème mais j'ai peur qu'en mettant le site en ligne par la suite, des erreurs surviennent parce qu'un problème d'encodage différent serait utilisé. Se serait balo.

    Bonne soirée

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 661
    Billets dans le blog
    1
    Par défaut
    A mon avis c'est que ton ficher lui même n'est pas en utf8
    ouvre le avec note pad++ et vérifie le format !
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Par défaut
    Oui en effet Notepad++ n'était pas en utf-8
    Depuis je me suis plus documenté sur le sujet et je comprends mieux la problématique des encodages.

    merci pour le coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme Codage UTF-8 ISO-8859-1
    Par maskk dans le forum Développement
    Réponses: 1
    Dernier message: 10/11/2010, 11h14
  2. [CR 8] UTF-8 problème d'affichage dans les rapports
    Par michael michael dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/11/2009, 17h11
  3. ASP.NET CHARSET UTF-8 iso-8859-1
    Par hottnikks_79 dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/07/2009, 17h10
  4. [Smarty] Pbm en ISO-8859-1 sur les pages incluses. Solution sans utiliser UTF8?
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/06/2008, 21h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo