Page 1 sur 1

[R] Comparer ae et æ

Posté : sam. 10 avr. 2021 23:28
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 ?

Re: [..] Comparer ae et æ

Posté : dim. 11 avr. 2021 11:57
par mikell
jpascal a écrit : sam. 10 avr. 2021 23:28Est-ce la "bonne" méthode ?
Oui

Re: [..] Comparer ae et æ

Posté : dim. 11 avr. 2021 12:49
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.

Re: [..] Comparer ae et æ

Posté : ven. 12 nov. 2021 19:12
par jpascal
Bonjour et désolé. J'avais omis de vous remercier pour ces informations complémentaires. :D

Re: [R] Comparer ae et æ

Posté : sam. 13 nov. 2021 00:22
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))