[RESOLU] Ecrire des caractères accentués dans une BDD

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

[RESOLU] Ecrire des caractères accentués dans une BDD

Message par Fig »

Bonjour à tous,

J'ai un soucis qui implique, je pense un problème avec l'unicode de Pb et l'UTF8 mais je n'arrive pas à mettre le doigt dessus...
Les japonais appellent ça "Mojibake" (ils sont souvent concernés) mais c'est passé dans le langage courant pour les langues qui ont des caractères particuliers.

Je sauvegarde dans ma base de donnée du texte accentué.
Ce texte passe à travers URLEncoder() pour une requête POST avec :

Code : Tout sélectionner

HttpRequest = HTTPRequest(#PB_HTTP_Post, #IPUpdateValue ,dats)
HttpRequest exige qu'on envoie les caractères au format UTF8 (ça aurait été pas mal que ça convertisse tout seul d'ailleurs :mrgreen: )
Ca part comme ça :

Code : Tout sélectionner

debug URLEncoder("é")
%C3%A9
Mais dans ma base de donnée c'est sous la forme:

Code : Tout sélectionner

é
Et cela me génère un caractère d'erreur lorsque je relis ce caractère puis UrlDecoder() Quelle est la manipulation à faire avec UTF8() -je suppose- pour que la chaine de caractère arrive dans la BDD comme souhaité ?

J'ai essayé ça sans succès:

Code : Tout sélectionner

	*dat=UTF8(dats)
	;HttpRequest = HTTPRequest(#PB_HTTP_Post, #IPUpdateValue ,dats)
	HttpRequest = HTTPRequestMemory(#PB_HTTP_Post, #IPUpdateValue ,*dat,MemorySize(*dat))
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ecrire des caractères accentués dans une base de donnée

Message par falsam »

La base de données est elle bien encodée UTF-8 (utf8_general_ci) ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Ecrire des caractères accentués dans une base de donnée

Message par Fig »

Si c'est l'interclassement, non... Mais je croyais que ça n'affectait que l'ordre des caractères entre eux lors de tris :oops:
Je vais changer l'interclassement pour voir...

edit j'ai mis: utf8mb3_general_ci en interclassement, ça ne change rien...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Ecrire des caractères accentués dans une base de donnée

Message par boddhi »

@fig
Réponse en coup de vent, si ça peut aider...
Ton caractère 'é' est encodé en ISO-8859-1, ce qui te retourne 'A@' (voir ici)
Une solution (sans recherche approfondie) à creuser : https://www.purebasic.fr/english/viewto ... 90#p575081
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ecrire des caractères accentués dans une base de donnée

Message par falsam »

J'ai fait ce petit test qui consiste a envoyé un nom d'utilisateur et une phrase à un script php.
Je ne traite pas l'envoi vers une base de donnée. Je voulais juste voir ce que devenaient les données une fois capturées par le script php.
Le script php fait un echo de ce qu'il a reçu.

Exemple user=Màîwéèn et say=hello

j'ai bien en retour les valeurs que j'ai passées au script php.

le code

Code : Tout sélectionner

Define url.s = "https://falsam.com/racal/test.php?" 
Define buffer.s = URLEncoder(url + "user=Màîwéèn&say=Hello") 
Debug "Data :  " + buffer 

HttpRequest = HTTPRequest(#PB_HTTP_Get, Buffer)

If HttpRequest
  Debug "Status: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
  Debug "Réponse: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
  
  FinishHTTP(HTTPRequest)
Else
  Debug "La requête a échoué"
EndIf
debug
Data : https://falsam.com/racal/test.php?user= ... &say=Hello
Status: 200
Réponse: Màîwéèn a dit Hello
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Ecrire des caractères accentués dans une base de donnée

Message par Fig »

j'utilise le code php suivant:
Peut être que ça vient de la fonction mysqli_real_escape_string... ?
Il faut peut être définir le jeu de caractère avec mysqli_set_charset() ? Je regarde ça...
Dernière modification par Fig le dim. 19/mars/2023 14:37, modifié 1 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ecrire des caractères accentués dans une base de donnée

Message par falsam »

Je vois rien d'anormal dans ton script.

Essaye d'envoyer tes données avec un header décrivant le type de données que tu envois.

Code : Tout sélectionner

Define NewMap Header.s()
Header("Content-Type") = "text/html; charset=utf-8"
 
Define url.s = "https://falsam.com/racal/test.php?" 
Define buffer.s = URLEncoder(url + "user=Màîwéèn&say=Hello") 
Debug "Data :  " + buffer 

HttpRequest = HTTPRequest(#PB_HTTP_Get, Buffer, "", 0, Header() )

If HttpRequest
  Debug "Status: " + HTTPInfo(HTTPRequest, #PB_HTTP_StatusCode)
  Debug "Réponse: " + HTTPInfo(HTTPRequest, #PB_HTTP_Response)
  
  FinishHTTP(HTTPRequest)
Else
  Debug "La requête a échoué"
EndIf
J'y crois pas trop :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Ecrire des caractères accentués dans une base de donnée

Message par boddhi »

Peut-être faut-il revoir revoir l'encodage initial des données dans la base ?
https://stackoverflow.com/questions/160 ... ry-to-utf8
Dernière modification par boddhi le dim. 19/mars/2023 14:04, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Ecrire des caractères accentués dans une base de donnée

Message par falsam »

Dans ton script Php ajoute

Code : Tout sélectionner

mysqli_set_charset($conn, "utf8mb4");
après ta connexion à la base de données.
La base de données doit être formater UTF8.

Source : https://www.php.net/manual/fr/mysqli.set-charset.php
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Ecrire des caractères accentués dans une base de donnée

Message par Fig »

falsam a écrit : dim. 19/mars/2023 14:02 Dans ton script Php ajoute

Code : Tout sélectionner

mysqli_set_charset($conn, "utf8mb4");
après ta connexion à la base de données.
La base de données doit être formater UTF8.

Source : https://www.php.net/manual/fr/mysqli.set-charset.php
Ca a fonctionné !!

Merci infiniment à tous, Falsam en particulier :D
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre