Résolu J'ai raté quelque chose ?

Codes specifiques à MacOS X
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Résolu J'ai raté quelque chose ?

Message par Good07 »

Bonjour à tous,
J'essaye d'utiliser EscapeString et son inverse UnescapeString dans mon programme et je m'aperçois que ça ne change absolument rien à la chaine de caractères.
Voici un petit exemple:

Code : Tout sélectionner

A.s="JE SUIS UNE CHAINE ORDINAIRE"
Debug Len(A)
Debug Len(EscapeString(A,#PB_String_EscapeInternal)); là c'est pas normal si on en crois la fonction... :x 
A=A+Chr(10)+chr(13)
Debug Len(A)
Debug Len(UnescapeString(A,#PB_String_EscapeInternal))
Debug EscapeString("Test="+Chr(34)+"Hello"+Chr(34)+".") ; Affiche "Test=\"Hello\".";exemple de PureBasic
Système:
macOSMojave
Version 10.14
iMac (Retina 5K, 27-inch, 2017)
Dernière modification par Good07 le mar. 06/nov./2018 17:58, modifié 1 fois.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: J'ai raté quelque chose ?

Message par boby »

Code : Tout sélectionner

A.s="JE"+Chr(34)+" SUIS"+Chr(34)+" UNE"+Chr(34)+" CHAINE"+Chr(34)+" ORDINAIRE"
Debug Len(A)
Debug Len(EscapeString(A,#PB_String_EscapeInternal))
ReplaceString(A,Chr(34),"\")
Debug Len(UnescapeString(A,#PB_String_EscapeInternal))
Debug EscapeString("Test="+Chr(34)+"Hello"+Chr(34)+".")
Un peut plus d'infos sur ce que tu essaie de faire aiderai à mieux t'aider / orienter.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Re: J'ai raté quelque chose ?

Message par Good07 »

Bonsoir boby,
Merci pour ta réponse.
En fait, Je ne fais rien de compliqué. il m'arrive souvent d'utiliser des textes qui proviennent de traitement de texte que j'introduit dans mon programme par un copier/collé et qui comportent en fin de chaine des caractères de retour à la ligne ou de retour chariot. J'avais pensé que ces deux expressions pouvaient me permettre d'éliminer ceux-ci mais je n'ai pas dû comprendre la finalité de l'expression qui malgré ton exemple me semble un peu nébuleuse dans sa fonction. Pourtant si l'on regarde l"aide de EscapeString(Chaine$ [, Mode]) donne bien un tableau qui englobe les caractères que je veux éliminer de ma chaine.
\a: bip Chr(7)
\b: retour arrière Chr(8)
\f: saut de page Chr(12)
\n: retour à la ligne Chr(10)
\r: retour chariot Chr(13)
\t: tabulation horizontale Chr(9)
\v: tabulation verticale Chr(11)
\": double quote Chr(34)
\\: antislash Chr(92)
Sinon mon petit exemple servait à mettre en évidence que la fonction PB ne modifiait en rien la chaine et que ces caractères de fin de ligne restaient en place et n'étaient pas éliminés ou ajouté à la chaine.
Avant j'utilisais len(A)-2 mais il fallait que je sache à l'avance si ces caractères étaient présent ou non...
Le but de cette fonction étant quand même selon l'aide de : Transforme une chaîne avec des séquences d'échappement en chaîne standard
ce qu'elle ne fait apparemment pas avec les caractères de fin de chaine et c'est gênant pour moi.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: J'ai raté quelque chose ?

Message par Ollivier »

Tu as peut-être loupé quelquechose :

Code : Tout sélectionner

b$ = ~"Escape\nMe !" ; string with escape sequence
Le signe "alternatif" (~) avant ta chaîne?
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: J'ai raté quelque chose ?

Message par boby »

Hum, ça demande une double oppération, mais si c'est ce que tu cherche à obtenir :

Code : Tout sélectionner

A.s="JE SUIS UNE CHAINE ORDINAIRE"
Debug Len(A)
A+Chr(10)+Chr(13)
Debug Len(A)
A = RTrim(A,Chr(13))
A = RTrim(A,Chr(10))
Debug Len(A)
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: J'ai raté quelque chose ?

Message par Marc56 »

Les chaines d'échappement ne sont utilisées en PB (et autres langages) que pour la facilité de représentation lors de l'utilisation et l'affichage.
Mais pour que PB interprète les chaines d'échappement, il faut préfixer la chaine avec un Tilde (~).
Pour supprimer un caractères en trop, c'est Rtrim, Ltrim, et Trim (pour un/des espaces). ReplaceString() pour remplacer plusieurs d'un coup n'importe où.
#CRLF$ étant considéré comme deux caractères, on ne peut l'utiliser avec Rtrim.

En un mot, (Un)escapeString() ne changent que l'affichage et pas le contenu.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Résolu Re: J'ai raté quelque chose ?

Message par Good07 »

Bonjour à tous
Merci à tous pour vos réponses. Je n'avais effectivement pas compris l'utilisation de cette fonction.
En fait, j'utilise ces chaines de caractères pour mon programme de cryptographie et il faut que je nettoie les chaines avant de les utiliser. J'enlève donc tous les caractères accentués, les virgules, les points etc. Ca n'aurait pas de répercussion sur une cryptographie moderne, mais je traite surtout des cryptogrammes anciens (IXXe ou plus ancien) et ils n'utilisaient pas ce genre de caractères. J'ai donc réfléchi aux solutions que vous m'avez apporté et j'ai conçu un petit programme plus général pour mon cas.
Procedure FormaterText()
a$=GetGadgetText(#Edgadget1)
For n=1 To Len(a$)
b$=Mid(a$,n,1)
Select b$
Case "é","è","ê","ë"
b$="e"
Case "ô","ö"
b$="o"
Case "ï","î"
b$="i"
Case ".",";",",","?","!",":","'","(",")","-","«","»",Chr(10),Chr(13),Chr(32),Chr(34)
b$=""
Case "à","â"
b$="a"
Case "ù","ü"
b$="u"
Case "ç"
b$="c"
EndSelect
texte$=texte$+b$
Next n
SetGadgetText(#Edgadget1,texte$)
EndProcedure

Il y aurait peut-être plus simple avec RegularExpression mais ça fonctionne très bien comme ça et je peux facilement rajouter des caractères à exclure de la chaine.
Merci à tous pour vos réponses.
Dernière modification par Good07 le mar. 06/nov./2018 16:25, modifié 1 fois.
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: J'ai raté quelque chose ?

Message par Marc56 »

Une version avec en moins de lignes et donc assez facile à modifier.
Mais ne traite pas:
".",";",",","?","!",":","'","(",")","-","«","»",Chr(10),Chr(13),Chr(32),Chr(34)
:idea: :?: Ajouter un RemoveString() avant ou après ?

(Basé sur le principe de la commande unix 'tr'. Ex: tr '[àâäéèêëîïôöùûü]' '[aaaeeeeiioouuu]')
Auteur: je sais pas.

Code : Tout sélectionner

Procedure.s DisableAccent(Buffer.s)
    Protected i
    Protected CharToFind.s    = "àáâãäåçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝŸ"
    Protected CharToReplace.s = "aaaaaaceeeeiiiinooooouuuuyyAAAAAACEEEEIIIINOOOOOUUUUYY"
    
    For i = 1 To Len(CharToFind)
        ReplaceString(Buffer, Mid(CharToFind,i,1), Mid(CharToReplace,i,1), #PB_String_InPlace, 1)
    Next
    ProcedureReturn Buffer
EndProcedure

Debug DisableAccent("Débâcher , DÉBOÎTER")

Code : Tout sélectionner

Debacher , DEBOITER
On peut sans doutes faire plus vite en ASM ou à base de Peek et Poke.
(voir ce que ça donne sur un gros fichier)

:wink:
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: J'ai raté quelque chose ?

Message par Ollivier »

Ah oui : le symbole ~ ne s'appelle pas "alternatif" mais s'appelle "tilde".
Merci Marc56 pour ce rappel. J'avais pas tildé...
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Re: J'ai raté quelque chose ?

Message par Good07 »

Bonjour à tous et merci pour vos réponses.
Marc ta façon d'aborder le problème est intéressante, mais comme il est dit dans un autre post avec la vitesse des processeurs actuels, ce n'est pas quelques lignes de plus ou de moins qui vont faire une différence de vitesse. Je ne traite que des textes de 1000 caractères max et c'est instantané.
Mais il est vrai que j'aime voir comment on peut aborder le problème de façon différente et ça m'aide à comprendre la subtilité de la programmation.
Le problème est donc résolu mais je n'arrive pas à le marquer dans le titre du post.
Si une âme charitable peut le faire merci d'avance.
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: J'ai raté quelque chose ?

Message par Ollivier »

Ah y'a une technique pour éditer le titre.
1) Tu te connectes
2) Tu vas sur ton premier message en tête de sujet
3) Tu cliques sur [Editer], en queue de premier message
4) Dans le formulaire à deux saisies (titre et message) tu modifies ton titre à ta guise

Bon, il y a des âmes charitables bien sûr, mais c'est au cas où ils n'aient pas le temps à l'avenir.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Re: Résolu J'ai raté quelque chose ?

Message par Good07 »

Merci Olivier, c'est fait si je ne me suis pas trompé... :D
Répondre