Page 1 sur 1

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

Publié : dim. 19/mars/2023 11:41
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))

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

Publié : dim. 19/mars/2023 12:02
par falsam
La base de données est elle bien encodée UTF-8 (utf8_general_ci) ?

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

Publié : dim. 19/mars/2023 12:13
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...

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

Publié : dim. 19/mars/2023 12:58
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

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

Publié : dim. 19/mars/2023 13:13
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

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

Publié : dim. 19/mars/2023 13:24
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...

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

Publié : dim. 19/mars/2023 13:38
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:

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

Publié : dim. 19/mars/2023 13:59
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

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

Publié : dim. 19/mars/2023 14:02
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

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

Publié : dim. 19/mars/2023 14:55
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