SpringReplace

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

SpringReplace

#1

Message par 28IL »

Bonjour à toutes et tous,

Désolé, je reviens avec mes petits soucis car j'ai beau chercher, ben trouve pas :shock:

J'aimerai juste changer certains caractères spéciaux comme les é, è apostrophes, etc... que l'utilisateur tape dans le "cadre" et transforme ces caractères par des E ou espace avant d'alimenter un fichier plat sous Centreon(Linux).

Hors, j'arrive bien à position un type de changement mais pas les autres :
Local $commentaires = GUICtrlCreateEdit("", 24, 100, 317, 81,$ES_AUTOVSCROLL)
...
Local $sString = StringReplace(GUICtrlRead($commentaires), "à", "a")
Local $sString = StringReplace(GUICtrlRead($commentaires), "é", "e")
Local $iReplacements = @extended
MsgBox($MB_SYSTEMMODAL, "", $iReplacements & " Les caractères spéciaux sont remplacés comme suit :" & @CRLF & @CRLF & $sString)
Donc il doit y avoir une boucle que je maitrise pas, désolé...

Merci pour votre aide précieuse les amis.
Bonne journée...
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2217
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: SpringReplace

#2

Message par jchd »

Si je comprends bien, il s'agit déjà d'une désaccentuation.

Code : Tout sélectionner

; Unicode Normalization Forms
Global Enum $UNF_NormC = 1, $UNF_NormD, $UNF_NormKC = 5, $UNF_NormKD

Func _UNF_Change($sIn, $iForm)
	If $iForm = $UNF_NormC Or $iForm = $UNF_NormD Or $iForm = $UNF_NormKC Or $iForm = $UNF_NormKD Then
		Local $aRet = DllCall("Normaliz.dll", "int", "NormalizeString", "int", $iForm, "wstr", $sIn, "int", -1, "ptr", 0, "int", 0)
		Local $tOut = DllStructCreate("wchar[" & 2 * ($aRet[0] + 20) & "]")
		$aRet = DllCall("Normaliz.dll", "int", "NormalizeString", "int", $iForm, "wstr", $sIn, "int", -1, "ptr", DllStructGetPtr($tOut, 1), "int", 2 * ($aRet[0] + 20))
		Return DllStructGetData($tOut, 1)
	Else
		SetError(1, 0, $sIn)
	EndIf
EndFunc   ;==>_UNF_Change

Func _Unaccent($s, $iMode = 0)
	Local Static $aPat = [ _
		"(*UCP)[\x{300}-\x{36F}`'¨^¸¯]", _    ; $iMode = 0 : remove combining accents only
		"(*UCP)\p{Mn}|\p{Lm}|\p{Sk}" _        ; $iMode = 1 :     "       "       "    and modifying letters
	]
	Return StringRegExpReplace(_UNF_Change($s, $UNF_NormD), $aPat[Mod($iMode, 2)], "")
EndFunc   ;==>_Unaccent

Local $aStrings = [ _
	"aàâäã cç eéèêë iîï oôöõ uùûü yÿ", _
	"AÀÂÄÃ CÇ EÉÈÊË IÎÏ OÔÖÕ UÙÛÜ YŸ", _
	"àáâãäåçèéêëìíîïñòóôõöùúûüýåýāāăăąąććĉĉċċččďďǘǚǚǣǣȑȑȓȓȩȩӝӝӟӟ", _	; scripts latin, cyrillique et autres
	"ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝÅÝĀĀĂĂĄĄĆĆĈĈĊĊČČĎĎǗǙǙǢǢȐȐȒȒȨȨӜӜӞӞ" _
]

For $s In $aStrings
	MsgBox(0, "", $s & @LF & _Unaccent($s))
Next
Attention, ce code ne fait pas de conversion par compatibilité (au sens Unicode). Par exemple le ı minuscule turc (LATIN SMALL LETTER DOTLESS I) n'est pas converti en "i". De même les caractères Unicode en exposant ou indice ne sont pas convertis en leurs correspondants naturels. Pour faire ça il faut déployer une artillerie plus sérieuse. Si besoin, je peux fournir une DLL fonctionnant avec SQLite qui fait ça et bien plus.

Pour les caractères autres (apostrophes et tout ce qu'on veut), il faut préciser. Un stringregexreplace ferait ça facilement, à priori.

Par curiosité, pour faire tout ça alors que Linux lit parfaitement Unicode, en UTF8 ou autre convention d'encodage ?
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

Re: SpringReplace

#3

Message par 28IL »

Bonsoir jchd,

Merci beaucoup pour votre aide. Je teste le script dès demain matin. Concernant la reconnaissance des caractères spéciaux sous Linux, j'en doute pas mais je pense que le souci est côté interface Centreon/Nagvis et les zones de textes.

J'utilise plink.exe pour envoyer le texte saisie par l'opérateur ($commentaires) dans un fichier au format "Unix (LF)" sur le serveur Linux et qui sera lu par Centreon/nagvis :
Run("plink.exe -ssh user@serveur_centreon -pw XXXXXX /root/carte_nagvis '"& GUICtrlRead($Service) &"' '"& GUICtrlRead($commentaires) &"' '"& GUICtrlRead($Astreinte) &"'","",@SW_HIDE)
Si je mets aucun accent, parenthèse ou apostrophe, tout va bien. Dès que le texte en contient, le fichier ini ne se met pas à jour et je comprends pas pourquoi.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2217
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: SpringReplace

#4

Message par jchd »

Quel encodage est attendu, soit par plink, soit par Navgis. Normalement, Centreon devrait supporter Unicode, typiquement en UTF8.
Quel rapport avec un fichier .ini ? Ce format Windos ne permet pas originellement de gérer Unicode mais il y a moyen de passer outre cette limitation.

Il faudrait essayer en convertissant les chaînes saisies en UTF8 avant envoi via plink.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

Re: SpringReplace

#5

Message par 28IL »

Le rapport est que mon fichier /root/carte_nagvis que j'alimente avec les commentaire de l'utilisateur est au format "Unix (LF)" et non UTF8 déjà.

Donc si je dis pas de bêtise, si je balance une chaine de caractères en UFT8, faut que le fichier soit aussi dans ce même format ?

Comment forcer UTF8 à la la saisie dans :
Local $commentaires = GUICtrlCreateEdit("", 24, 100, 317, 81,$ES_AUTOVSCROLL)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2217
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: SpringReplace

#6

Message par jchd »

UTF8 est un encodage de points de code Unicode, pas un format de fichier. Je ne sais pas ce que tu entends par "Unix (LF)".

Code : Tout sélectionner

Local $sUCS2 = "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝÅÝĀĀĂĂĄĄĆĆĈĈĊĊČČĎĎǗǙǙǢǢȐȐȒȒȨȨӜӜӞӞ"
Local $sUTF8 = BinaryToString(StringToBinary($sUCS2, 4), 1)
FileWriteLine("fichier.txt", $sUTF8)
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

Re: SpringReplace

#7

Message par 28IL »

Unix (LF), c'est le format de mon fichier sous Linux quand je l'ouvre avec Notepad++

Donc je comprends bien, ma chaine de caractère à saisir doit être au format Unicode (UTF8) mais si je l'envoie via mon plink.exe, le fichier devrait être aussi au format UTF8 et non Unix (LF) alors ?

Dans ton exemple de code, j'enregistre directement le texte saisie sous Linux et non dans un fichier txt. Comment puis je l'adapter stp ?
rgx
Niveau 4
Niveau 4
Messages : 54
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: SpringReplace

#8

Message par rgx »

Bonjour,

Unicode n'est pas Utf-8 mais une variante d'Utf-16

Le "format" unix/windows/mac ne fait que définir le type de saut de ligne (par défaut) pour les fichiers texte, indépendamment du type d'encodage des caractères:
  • Windows: CR + LF
  • Unix: LF
  • Mac: CR
PS. Pour faire des essais avec des programmes en ligne de commande, on peut forcer la console Windows à utiliser l'UTF-8 en tapant CHCP 65001 (On peut mettre ça dans un batch, mais éviter de configurer la console (CMD.EXE) pour l'utiliser par défaut)

:wink:
Modifié en dernier par rgx le ven. 25 juin 2021 11:16, modifié 1 fois.
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 1996
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

Re: SpringReplace

#9

Message par TommyDDR »

Je ne vois pas le rapport avec le titre du sujet où est il question de ressort à remplacer ?


:P
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

Re: SpringReplace

#10

Message par 28IL »

Bonjour TommyDDR,

Comme j'ai un souci de caractères spéciaux, plusieurs idées sont apparues donc on s'est un peu éloigné mais seul le résultat compte Hihihi
rgx
Niveau 4
Niveau 4
Messages : 54
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: SpringReplace

#11

Message par rgx »

Bonjour,

Quand tu créé un fichier en UTF-8 il faut aussi mettre (ou pas) un BOM car les fichiers INI peuvent simplement l'ignorer mais aussi bloquer.
Il faut voir dans la doc du programme qui utilisera le fichier INI en lecture s'il le faut ou pas.
Les fichiers INI sont traités d'une manière différente selon les langages et programmes.
Un fichier INI sans aucun accent mais envoyé en UTF-8 sans BOM sera lisible comme un fichier ascii simple alors que la simple présence d'un accent provoquera l'encodage du caractère suivant sur 1 à 6 octets. D'ou un fichier ignoré.
Vaste programme l'utf :o mais une fois compris ça simplifie les choses entre OS

Enfin bref, pour en revenir à SpringReplace (et hop on revient au sujet :P ) ce serait dommage de devoir passer par un transtypage alors que l'application peut peut-être lire les accents.

:wink:
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2217
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: SpringReplace

#12

Message par jchd »

Unicode n'est pas Utf-8 mais une variante d'Utf-16
NON !

Unicode c'est la spécification d'un jeu de caractères, chacun identifié par une valeur entière appelée point de code (codepoint).
Un point de code a une valeur dans l'ensemble [0x000000, 0x00D7FF] U [0x00E000,0x10FFFF]. Les valeurs 0xD800 à 0xDFFF sont utilisés comme "surrogates" pour les représentations UTF16, mais nous n'en avons pas besoin ici.

Pour représenter, gérer, stocker, transmettre les points de code on utilise un encodage standard. Il en existe 5, d'autres ayant été abandonnés :
UTF8 où un codepoint est représenté par 1 à 4 octets
UTF16LE où un codepoint est représenté par 1 à 2 mots de 16 bits en little endian (petit boutiste)
UTF16BE où un codepoint est représenté par 1 à 2 mots de 16 bits en big endian (gros boutiste)
UTF32LE où un codepoint est représenté par 1 double mot de 32 bits en little endian (petit boutiste)
UTF32BE où un codepoint est représenté par 1 double mot de 32 bits en big endian (gros boutiste)

AutoIt utilise en fait un jeu de caractère réduit d'Unicode, UCS2, qui permet de gérer le BMP Unicode (Basic Multilingual Plane), soit les points de code 0x0000 à 0xFFFF sans "surrogates" avec une représentation en UTF16LE limitée à 1 mot de 16 bits.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2217
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: SpringReplace

#13

Message par jchd »

Code : Tout sélectionner

Local $sToRun = "plink.exe -ssh user@serveur_centreon -pw XXXXXX /root/carte_nagvis '" & _
				GUICtrlRead($Service) & "' '" & _
				GUICtrlRead($commentaires) & "' '" & _
				GUICtrlRead($Astreinte) & "'"
Local $sUTF8 = BinaryToString(StringToBinary($sToRun, 4), 1)
; en supposant que plink attende de l'UTF8
Run($sUTF8, "", @SW_HIDE)
; sinon faire un batch
;   chcp 65001
;   plink ..............
; puis
; run(batch......)
; voir aussi https://stackoverflow.com/questions/1154674/plink-change-character-set-translation-to-utf-8-utf8
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
28IL
Niveau 3
Niveau 3
Messages : 48
Enregistré le : mar. 30 mai 2017 09:22
Localisation : Dreux
Status : Hors ligne

Re: SpringReplace

#14

Message par 28IL »

Merci jchd et Rgx pour votre aide, explication et surtout vos codes. Vous avez été hyper patient avec moi donc je vous tire mon chapeau.

Je teste ça lundi matin et je vous dirai...Bon week end.
Répondre