Bonjour à tous.
Je viens de Delphi et je suis en train de convertir mes codes.
J'ai découvert un sacré problème concernant le traitement des strings (j'ai vu que je n'étais pas le seul, cfr un message précédent sur ce forum) en tentant de compiler une fonction de remplacement des caractères accentués.
Lazarus utilise le Utf8.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 function SU_RemoveAccents(const S: string): string; var Ch: Char; L: Integer; Source, Dest: PChar; begin L := Length(S); SetLength(Result, L); Source := Pointer(S); Dest := Pointer(Result); while L <> 0 do begin Ch := Source^; case Ch of 'á', 'à', 'â', 'ä' : Ch:= 'a'; // ... end; Dest^ := Ch; Inc(Source); Inc(Dest); Dec(L); end; end;
Les fonctions de chaines pourtant baptisées "Ansi..." marchent bien mais problèmes lors d'un traitement caractère par caractère.
S:= 'élèves'
Length(S) --> 8
P:= Pos('è', S) --> 4
S2:= Copy(S, P+1, Length(S) --> évidemment ne marche plus puisque les caractères accentués prennent 2 octets.
Transformer S en chaine Ansi ne m'aide pas. La longueur retombe à 6, mais je n'ai plus les caractères accentués.
Après des heures de recherche, je vois enfin un site (http://www.marclebrun.be/wiki/doku.p...mes_rencontres) qui me donne la solution : travailler en fichier source Ansi (il fallait y penser !).
C'est Ok, mais comme les propriétés strings de composants sont en Utf8, cela m'oblige à faire :
S:= Utf8ToAnsi(edit1.text);
Voyez-vous une autre solution que d'encoder en Ansi ?
Autrement dit, comment savoir si un caractère occupe 1 octet ou plus.
Merci d'avance.
Cordialement
Thierry
Partager