[R] Comparer ae et æ

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

[R] Comparer ae et æ

#1

Message par jpascal »

Bonsoir,

Si je veux savoir si ces deux chaînes de caractères sont différentes avec l'opérateur <>, cela ne fonctionne pas.
If 'ae' <> 'æ' then ConsoleWrite('ae <> æ' & @CRLF)

Je réussis à le faire en utilisant :
If Not ('ae' == 'æ') Then ConsoleWrite('ae <> æ' & @CRLF)

Est-ce la "bonne" méthode ?
Modifié en dernier par jpascal le ven. 12 nov. 2021 19:12, modifié 1 fois.
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comparer ae et æ

#2

Message par mikell »

jpascal a écrit : sam. 10 avr. 2021 23:28Est-ce la "bonne" méthode ?
Oui
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Comparer ae et æ

#3

Message par jchd »

Tout dépend de ce qu'on considère "différent", du point de vue d'Unicode et/ou du point de vue de l'utilisateur. Selon la normalisation Unicode impliquée dans la comparaison, le réglage de langue en vigueur et la nature des points de code considérés, on trouve que des chaînes sont soit égales (on devrait dire "équivalentes"), soit distinctes :
ConsoleWrite(StringCompare('ae', 'æ') & @LF)
ConsoleWrite(StringCompare('ae', 'æ', 1) & @LF)
ConsoleWrite(StringCompare('ae', 'æ', 2) & @LF & @LF)

ConsoleWrite(StringCompare('aE', 'æ') & @LF)
ConsoleWrite(StringCompare('aE', 'æ', 1) & @LF)
ConsoleWrite(StringCompare('aE', 'æ', 2) & @LF & @LF)

ConsoleWrite(StringCompare('oe', 'œ') & @LF)
ConsoleWrite(StringCompare('oe', 'œ', 1) & @LF)
ConsoleWrite(StringCompare('oe', 'œ', 2) & @LF & @LF)

ConsoleWrite(StringCompare('fi', 'fi') & @LF)
ConsoleWrite(StringCompare('fi', 'fi', 1) & @LF)
ConsoleWrite(StringCompare('fi', 'fi', 2) & @LF & @LF)

ConsoleWrite(StringCompare('Dz', 'ʣ') & @LF)
ConsoleWrite(StringCompare('Dz', 'ʣ', 1) & @LF)
ConsoleWrite(StringCompare('Dz', 'ʣ', 2) & @LF & @LF)
Il y a une distinction de taille dans le traitement des "lettres simples" (æ en est une !), des ligatures (ligatures latines : IJ, ij, Œ, œ, ff, fi, fl, ffi, ffl, ſt, st), les digraphes (digraphes latins : ȸ, ȹ, ʣ, ʤ, ʥ, ʦ, ʧ, ʨ, ʩ, ʪ, ʫ) et les digrammes (pour les langues non latines).

Du fait de la complexité de la structure et de l'évolution des scripts humains (langues écrites), les linguistes ont dû introduire ce type de caractérisations qui peuvent troubler les néophytes que nous sommes en majorité !
Du coup Unicode embarque des complexités subtiles, bien qu'il simplifie énormément l'expression écrite universelle.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

Re: [..] Comparer ae et æ

#4

Message par jpascal »

Bonjour et désolé. J'avais omis de vous remercier pour ces informations complémentaires. :D
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Comparer ae et æ

#5

Message par jchd »

On peut décomposer les ligatures latines, mais pas les "lettres simples" (æ, Œ, œ, ...) ni les digraphes. Pour ça il suffit de change la normalisation Unicode de la chaîne.

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

Local $s = "挜IJijfffiflffifflſtstȸȹʣʤʥʦʧʨʩʪʫ"         ; forme C normale sous Windows
Local $t = _UNF_Change($s, $UNF_NormKC)                    ; forme KC, décomposition

;vd($s)  ; variable dump qui affiche                    String (23)        '挜IJijfffiflffifflſtstȸȹʣʤʥʦʧʨʩʪʫ'
;vd($t)  ; variable dump qui affiche                    String (34)        '挜IJijfffiflffifflststȸȹʣʤʥʦʧʨʩʪʫ'

_ArrayDisplay(StringToASCIIArray($s))
_ArrayDisplay(StringToASCIIArray($t))

La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre