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. 8)
Je ne sais pas si c'est mieux...mais j'en ai d'autres dans ma besace :mrgreen:

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 :roll:

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 :mrgreen:

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... :wink:

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