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 \*
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.