Quels sales caractères !
Résolu/Fermé
heliconius
Messages postés
539
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 juin 2023
-
16 mai 2020 à 00:44
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 16 mai 2020 à 17:28
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 16 mai 2020 à 17:28
A voir également:
- Quels sales caractères !
- Caractères ascii - Guide
- Caractères spéciaux clavier azerty - Guide
- Caractères spéciaux - Guide
- Caractères spéciaux mac - Guide
- 8 caractères exemple - Guide
1 réponse
jordane45
Messages postés
38350
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 décembre 2024
4 719
16 mai 2020 à 01:46
16 mai 2020 à 01:46
Bonjour,
Je commencerai par ça : https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8
Je commencerai par ça : https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8
16 mai 2020 à 17:28
Merci beaucoup mais cette page, quoique intéressante, ne fournit pas la solution du problème. De même qu'en grammaire il faut respecter la concordance des temps, cette page explique la nécessité de respecter la concordance d'encodage entre l'éditeur, la BDD et l'affichage dans le navigateur pour que l'accentuation soit correctement respectée. Mais elle apporte un éclairage évident sur la manière de travailler ainsi que d'autres informations utiles mais n'explique pas la "majusculisation" avec PHP (je n'osais pas dire la capitalisation, ça fait un peu trop financier).
Le problème avec PHP et ses fonctions , et est qu'il travaille caractère par caractère (octet par octet) et que dans par exemple, il remplace chaque caractère de "àâäéèêëîïôöùûüç" par le caractère ayant la même position dans "aaaeeeeiioouuuc". De ce fait, avec l'encodage ANSI
fonctionne très bien et "molière" devient "moliere" qu'on peut ensuite mettre en majuscules :
fonctionnera très bien en ANSI et molière en minuscules s'écrira MOLIERE en majuscules.
Sauf que... pour gagner en nombre de caractères possibles, UTF-8 code sur 1 octet un caractère ASCII et sur 2 octets (2 caractères) nos caractères diacritiques (accentués et cédilles) De ce fait, le " " devient " " et il faudrait pouvoir travailler non plus caractère par caractère mais caractère par double-caractère. Alors forcément, quelle que soit l'ordre d'imbrication dans le cumul des fonctions , , , le résultat était voué à l'échec.
J'ai trouvé deux solutions. La première en PHP, la seconde en javascript.
J'ai constaté qu'en cas de nos caractère diacritique --je ne parle pas des caractères vietnamiens ou chinois-- (donc sur 2 octets, 2 caractères), le premier est toujours ' '. La fonction qui résout mon problème est, dans une boucle, de vérifier la chaîne, caractère après caractère. Si c'est un caractère ANSI (1 octet), il est ajouté à une chaîne initialement vide, si c'est le caractère ' ', (signalant un caractère UTF-8 sur 2 octets) on vérifie le suivant --ex: ' '-- pour ajouter à la chaîne la lettre correspondante non accentuée. Et cela fonctionne très bien. molière "majusculé" devient MOLIERE. Voici le code qui remplit son office :
Mais attention ! Ce code ne fonctionne que s'il est écrit avec un éditeur ANSI ou encodé en ANSI (Notepad++ : Encodage/Encoder en ANSI) car s'il est écrit avec un éditeur UTF-8, le caractère de comparaison du sera écrit, lui aussi en UTF-8. Du coup la comparaison échouera, le remplacement ne se fera pas et l'on réobtiendra MOLIèRE à la place de MOLIERE.
La seconde solution ne réside donc pas dans PHP mais côté client avec du javascript. Lors de la soumission du formulaire une function verif() est exécutée et la valeur du champ saisi est remplacée par sa conversion en majuscules [ ]. Dans ce cas on obtiendra des majuscules accentuées (molière => MOLIÈRE) et on ne mettra pas ce champ en majuscules lorsqu'il arrivera dans PHP. Ou seconde solution --que j'ai adoptée-- je remplace les lettres accentuées par ces mêmes lettres non accentuées (molière => moliere). Dans ce cas, utilisation de côté PHP (moliere => MOLIERE). Voici le code javascript :
Voilà. C'est un peu long mais si ça peut servir... UTF-8, malgré les apports indéniables pour la diversité des caractères que ça apporte est malgré tout un vrai casse-tête.
En tout cas, le lien proposé était utile et j'y ai appris qu'on pouvait préciser lors de la connexion à la BDD le charset qui sera utilisé. Finalement, je ne suis pas mécontent qu'on m'ait fortement conseillé d'utiliser PDO.. ;-) Plus de possibilités et plus de polyvalences par rapport aux types de BDD.
Merci et à plus tard...
Problème résolu.