Conversion string en ascii <> unicode

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Conversion string en ascii <> unicode

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Conversion string en ascii <> unicode

Message 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:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Conversion string en ascii <> unicode

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Conversion string en ascii <> unicode

Message 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..
Dernière modification par Anonyme2 le mar. 06/sept./2011 5:44, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Conversion string en ascii <> unicode

Message 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 ...
Avatar de l’utilisateur
GeBonet
Messages : 453
Inscription : ven. 29/févr./2008 16:17
Localisation : Belgique

Re: Conversion string en ascii <> unicode

Message 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:
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Re: Conversion string en ascii <> unicode

Message 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).
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Re: Conversion string en ascii <> unicode

Message 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
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Conversion string en ascii <> unicode

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Répondre