Page 1 sur 1
Conversion string en ascii <> unicode
Publié : lun. 05/sept./2011 14:49
par GallyHC
Bonjour tout le monde,
Suite a de nombreux problème avec la conversion entre ascii, unicode et vis-versa, mais aussi une discussion avec Thyphoon, on a trouvé cette fonction qui converti d’un format dans un autre.
Code : Tout sélectionner
Procedure.s StringConvert(stext.s, format.l = #PB_Unicode)
;
Define *mem
Define result.s
*mem = AllocateMemory(StringByteLength(stext, format)+2)
PokeS(*mem, stext, format)
result = PeekS(*mem, StringByteLength(stext, format)+2, format)
FreeMemory(*mem)
ProcedureReturn result
EndProcedure
Debug StringConvert("test", #PB_Unicode)
Debug StringConvert("test", #PB_Ascii)
Je vous la soumets, dite moi ce que vous en pense et surtout si vous avez mieux (je suis très intéresser).
Cordialement,
GallyHC
Re: Conversion string en ascii <> unicode
Publié : lun. 05/sept./2011 16:41
par Kwai chang caine
Merci du partage.
Je ne sais pas si c'est mieux...mais j'en ai d'autres dans ma besace
Celui ci de FWEIL
http://www.purebasic.fr/english/viewtopic.php?t=10908
Code : Tout sélectionner
; UNICODE strings
;
Procedure.l Ansi2Uni(ansi.s)
size.l=MultiByteToWideChar_(#CP_ACP,0,ansi,-1,0,0)
Dim unicode.w(size)
MultiByteToWideChar_(#CP_ACP, 0, ansi, Len(ansi), unicode(), size)
ProcedureReturn @unicode()
EndProcedure
Procedure.s Uni2Ansi(*Unicode.l)
size.l = WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, #Null, #Null, #Null, #Null)
ansi.s=Space(size)
WideCharToMultiByte_(#CP_ACP, 0, *Unicode, -1, @ansi, size, #Null, #Null)
ProcedureReturn ansi
EndProcedure
*pointeur=Ansi2Uni("Ben ça alors, dis donc, si j'avais su.")
Debug Uni2Ansi(*pointeur)
Celui ci de GNOZAL
Code : Tout sélectionner
Declare.s AnsiToAscii(MonMessageANSI.s)
If OpenConsole()
PrintN (AnsiToAscii("message envoyé !" )) ; respecte les accents
PrintN ( "Message envoyé !" ) ; ne respecte pas les accents
While Inkey() = "" : Wend
CloseConsole()
EndIf
Procedure.s AnsiToAscii(MonMessageANSI.s)
MonMessageASCII.s = MonMessageANSI
CharToOem_ (@MonMessageANSI, @MonMessageASCII)
ProcedureReturn MonMessageASCII
EndProcedure
Et d'autres qui ressemblent au tiens.
Je ne sais pas si ça peut t'aider

Re: Conversion string en ascii <> unicode
Publié : lun. 05/sept./2011 17:12
par Anonyme2
GallyHC a écrit :Bonjour tout le monde,
Suite a de nombreux problème avec la conversion entre ascii, unicode et vis-versa, mais aussi une discussion avec Thyphoon, on a trouvé cette fonction qui converti d’un format dans un autre.
Code : Tout sélectionner
Procedure.s StringConvert(stext.s, format.l = #PB_Unicode)
;
Define *mem
Define result.s
*mem = AllocateMemory(StringByteLength(stext, format)+2)
PokeS(*mem, stext, format)
result = PeekS(*mem, StringByteLength(stext, format)+2, format)
FreeMemory(*mem)
ProcedureReturn result
EndProcedure
Debug StringConvert("test", #PB_Unicode)
Debug StringConvert("test", #PB_Ascii)
Je vous la soumets, dite moi ce que vous en pense et surtout si vous avez mieux (je suis très intéresser).
Cordialement,
GallyHC
Salut GallyHC
en 64 bit :
résultat en mode unicode non activé (donc en ascii)
??
test
résultat en mode unicode activé
Ca plante : erreur ligne 7
Overflow in dynamically allocated memory block
en 32 bit :
résultat en mode unicode non activé (donc en ascii)
??
test
résultat en mode unicode activé
Ca plante : erreur ligne 7
Overflow in dynamically allocated memory block
Re: Conversion string en ascii <> unicode
Publié : lun. 05/sept./2011 17:45
par Anonyme2
J'ai retiré le code car il est faux
lorsque le l'ai posté hier soir, il y avait quelque chose qui me dérangeait mas je n'arrivais pas à savoir quoi..
Re: Conversion string en ascii <> unicode
Publié : lun. 05/sept./2011 17:57
par Anonyme2
Finalement, je me demande comment fonctionne PB au retour de procedure sur une chaine, je me demande si tout n'est pas converti dans le mode de compilation courant et qu'on se goure en tentant de retourner une chaine dans un format ...
Fred si tu passes par là, expliques-nous; tu en profiteras pour activer les rubriques du forum fr, tu sais celles que tu as laissé sur le forum en comme off topic ...
Re: Conversion string en ascii <> unicode
Publié : mar. 06/sept./2011 10:18
par GeBonet
Bonjour,
Denis a écrit :Finalement, je me demande comment fonctionne PB au retour de procedure sur une chaine, je me demande si tout n'est pas converti dans le mode de compilation courant et qu'on se goure en tentant de retourner une chaine dans un format ...
Je pense, que le retour d'une chaine est assurée pour autant que la procédure soit déclarée "string",
dès lors la procédure transmet simplement l'adresse de sa chaine à la variable "string" qui reçoit le retour... (Substitution d'adresse, pourquoi déplacer le train si il suffit de dire ou il est ?).
Mais bon, ce n'est que mon avis...

Re: Conversion string en ascii <> unicode
Publié : mar. 06/sept./2011 10:42
par Fred
Le format interne des strings est toujours le format dans lequel le prog est compilé. Donc il n'est pas possible d'avoir une chaine Unicode en mode Ascii par exemple (par contre de l'UTF8 en ascii ne pose pas de probleme).
Re: Conversion string en ascii <> unicode
Publié : mar. 06/sept./2011 12:50
par Guimauve
Fred a écrit :Le format interne des strings est toujours le format dans lequel le prog est compilé. Donc il n'est pas possible d'avoir une chaîne Unicode en mode Ascii par exemple (par contre de l'UTF8 en Ascii ne pose pas de problème).
Oui et cela pose un sacré problème lorsque l'on doit lire un fichier contenant des string créées par un programme compilé en en mode Ascii avec notre programme compilé en mode Unicode. Il faut vraiment faire une gymnastique pour arriver à lire les données.
Personnellement, je ne comprends pas bien pourquoi les programmeurs ne passent pas tous au mode Unicode. Selon moi une solution robuste et passe partout est préférable à toutes les autres.
A+
Guimauve
Re: Conversion string en ascii <> unicode
Publié : mer. 07/sept./2011 19:51
par GallyHC
Bonjour tous,
En fait il est vrai que dans une variable cela pose problème. Par contre en mémoire non (forcement) et comme pour la plus par du temps cela sert a un passage vers une dll, cette version est plus utile.
Voici le code,
Code : Tout sélectionner
Procedure.i StringConvert_memory(stext.s, format.l = #PB_Unicode)
;
Define *mem
Define result.s
*mem = AllocateMemory(StringByteLength(stext, format)+2)
PokeS(*mem, stext, -1, format)
ProcedureReturn *mem
EndProcedure
cordialement,
GallyHC