Page 1 sur 1

Probème d'accent *

Posté : dim. 12 juil. 2020 12:11
par Mickdu59
Salut , j'ai un soucis avec certain accent , pour les lettres c'est bon j'utilise le code ci dessous , mais j'ai un soucis avec les * et je sais pas comment les remplacer , j'ai ajouter * dans le tableau mais il me dit erreur donc....

Code : Tout sélectionner

Func _ChaineSansAccents($sString)
    ; Les caractères exotiques d'autres langues ne sont pas pris en compte.
    ; Complètez les tableaux si dessous pour prendre en compte d'autres types
    ; de caractères accentués.
    Dim $Var1[27] = ["à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ò", "ó", "ô", "ö", "ù", "ú", "û", "ü", "ý", "ÿ", "œ"]
    Dim $Var2[27] = ["a", "a", "a", "a", "a", "a", "ae", "c", "e", "e", "e", "e", "i", "i", "i", "i", "o", "o", "o", "o", "u", "u", "u", "u", "y", "y", "oe"]

    For $i = 0 To UBound($Var1) - 1
        $sString = StringRegExpReplace($sString, $Var1[$i], $Var2[$i])
        $sString = StringRegExpReplace($sString, StringUpper($Var1[$i]), StringUpper($Var2[$i]))
    Next
    Return $sString
EndFunc   ;==>_SansAccents

Re: Problème d'accent '

Posté : dim. 12 juil. 2020 14:06
par jchd
C'est un vaste sujet !

Dans l'exemple proposé il y a deux type de caractères : les caractères accentués et les ligatures (æ, œ) auxquelles il faudrait d'ailleurs rajouter d'autres ligatures latines (fi, fl, IJ, ij, DŽ, Dž, dž, ...) et quelques digraphes. Ceci dit æ est classifié comme ligature cyrillique !

Pour ce qui est des ligatures, là encore tout dépend de l'ambition initiale. Pour ça une approche par table marche bien, assez facile.

Pour gérer complètement l'ensemble du problème des seuls caractères accentués pour tous les scripts (script = langage écrit) d'Unicode, l'idéal est de faire effectuer cette tâche par la bibliothèque Unicode (ICU et consort). Par contre, c'est un gros, très gros, énorme bébé et il est très compliqué de le nourrir !

Si on se borne aux scripts latin, grec, cyrillique et quelques autres, on peut aborder la question avec le code qui suit. Je n'ai aucune notion d'arabe, d'hébreu, d'indic, de thai, ... et je ne me risque pas à formuler un avis.

Selon ce qu'on considère être un accent, la langue traitée et ce qu'on veut obtenir, on peut se débarrasser soit des seuls diacritiques, soit de toutes les modificatives. Le résultat sera plus ou moins adapté au langage qu'on "passe sous ce rabot". Il reste quand même pas mal de cas à traiter à part si on veut romaniser un texte : le plus courant est le i sans point turc (ı) mais il y a aussi le j sans point (ȷ), puis les deux avec barre (ɟ) et avec crochet (ʄ).

L'umlaut allemand est un peu délicat : on devrait désaccentuer la lettre mais y adjoindre un 'e'. Ainsi, Köln devrait idéalement devenir Koeln et pas Koln. Le eszet allemand ß se décompose habituellement en ss, sa majucule (récente et rare) en SS.

Ensuite se pose le problème de la bonne compréhension du résultat. Par exemple, la phrase "Æ e i åa å o e i åa o å" d'un dialecte trøndersk signifie littéralement "Je suis dans la rivière et elle aussi est dans la rivière". J'ignore si un locuteur natif comprendrait aisément "ae e i aa a o e i aa o a".

Il reste que beaucoup de scripts emploient des constructions complexes de diacritiques et modificatives qui seules donnent un sens à un graphème.
Pour un rapide tour d'horizon élémentaire des multiples cas qui peuvent se présenter, voire https://r12a.github.io/scripts/tutorial/part3
L'ensemble de ce site est une référence pratique pour Unicode, le standard lui-même étant une lecture extrêmement indigeste !

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, $Full = 0)
	Local Static $aPat = [ _
		"(*UCP)[\x{300}-\x{36F}`'¨^¸¯]", _		; combining accents only
		"(*UCP)\p{Mn}|\p{Lm}|\p{Sk}" _			;      "       "    + all modifying letters
	]
	Return StringRegExpReplace(_UNF_Change($s, $UNF_NormD), $aPat[Mod($Full, 2)], "")
EndFunc   ;==>_Unaccent

; ================ exemple =====================

Local $sInput = "Árvíztűrőñ tükörfúrógépçô ŵƂǚȨǽϋϔӪӢӂ"
Local $sFormD = _UNF_Change($sInput, $UNF_NormD)
Local $sOutput = _Unaccent($sInput)
Disp($sInput, $sOutput)
$sOutput = _Unaccent($sInput, 1)
Disp($sInput, $sOutput)

Func Disp($sInput, $sOutput)
	; Format the output.
	Local $sMsg = StringFormat("Input:\t%s\n\nOutput:\t%s", $sInput, $sOutput)
	MsgBox($MB_SYSTEMMODAL, "Results", $sMsg)
EndFunc   ;==>Display
Pour ce qui est du caractère * je ne vois pas l'intérêt. Par contre il ne peut figurer seul dans un patern de regex ! Utiliser \*

Re: Probème d'accent *

Posté : lun. 17 août 2020 11:13
par GMH
Wahooooo ! Si j'avais eu ce code pour désaccentuer mes lettres grecques, j'aurais gagné un temps fou. Pour faire ce travail, j'ai créé des dizaines de tableaux tels que :
Global $a[11] = ["ἁ","ἀ","ἅ","ἃ","ἄ","ἂ","ἇ","ἆ","ᾶ","ά","ὰ"]
Global $ai[3] = ["ᾄ","ᾅ","ᾷ"]
Global $AM[11] = ["Ἁ","Ἀ","Ἅ","Ἃ","Ἄ","Ἂ","Ἆ","Ἇ","῀Α","Ά","Ὰ"]
Global $e[9] = ["ἑ","ἐ","ἕ","ἓ","ἔ","ἒ","έ","ὲ","ἑ"]
Global $EM[8] = ["Ἑ","Ἐ","Ἕ","Ἓ","Ἔ","Ἒ","Έ","Ὲ"]
Global $h[12] = ["ἡ","ἠ","ἥ","ἣ","ἤ","ἢ","ἧ","ἦ","ῆ","ή","ὴ","ἡ"]

ETC. ...
Puis la fonction de remplacement, autant de fois :
For $g = 0 To UBound($a) - 1
$dernierTxt = StringReplace($dernierTxt,$a[$g],"α")
Next
For $g = 0 To UBound($ai) - 1
$dernierTxt = StringReplace($dernierTxt,$ai[$g],"ᾳ")
Next
For $g = 0 To UBound($e) - 1
$dernierTxt = StringReplace($dernierTxt,$e[$g],"ε")
Next
For $g = 0 To UBound($h) - 1
$dernierTxt = StringReplace($dernierTxt,$h[$g],"η")
Next
ETC. ...
Merci encore pour ce code. J'en tirerai profit la prochaine fois ...