Con stringreplace è andata, grazie.
Però per l'ottimizzazione del codice non mi piace ... mi spiego: con stringreplace, siccome devo sostituire tutte le lettere accentate, alla fine la stringa che contiene il nome del file, viene elaborata 6 volte, una per ogni lettera accentata
NomeFile:=StringReplace(NomeFile, 'à', 'a''', [rfReplaceAll]);
NomeFile:=StringReplace(NomeFile, 'è', 'e''', [rfReplaceAll]);
NomeFile:=StringReplace(NomeFile, 'é', 'e''', [rfReplaceAll]);
NomeFile:=StringReplace(NomeFile, 'ì', 'i''', [rfReplaceAll]);
NomeFile:=StringReplace(NomeFile, 'ò', 'o''', [rfReplaceAll]);
NomeFile:=StringReplace(NomeFile, 'ù', 'u''', [rfReplaceAll]);
Io invece preferivo scansionare il nome del file una volta sola e, se mi ritrovavo per le mani una lettera accentata, fare la sostituzione.
Purtroppo però non ho trovato nulla che mi permetta di scansionare una stringa UTF8 un carattere alla volta, o meglio, ho trovato questa http://wiki.freepascal.org/Theodp che permette di scansionare, però poi non permette di trattare il singolo carattere in maniera semplice.
Ciao, Mario
Grazie del consiglio, ma le espressioni regolari le potrei studiare solo in ferie, avendo a disposizione qualche settimana per ragionarci su !!!
Ci ho già provato un paio di volte in passato, ma ho sempre dovuto alzare bandiera bianca !!!
In ogni caso, casomai capitasse a qualcuno in futuro la stessa cosa, ieri ho fatto un po' di ricerche su Internet, stamattina ho fatto delle prove, ed ho capito come risolvere il problema.
Ecco il codice:
function SistemaNomeFile(NomeFileInp:String):String;
var IdxChr, TotChr:Integer;
NomeDir, NomeFile, NomeExt, NomeFileOut, ChrNew, ChrOld:String;
begin
//Inizizlizzazione output
Result:='';
//Scompongo il nome che mi arriva in directory, nome file ed estensione
NomeDir:=ExtractFileDir(NomeFileInp);
NomeFile:=ExtractFileNameOnly(NomeFileInp);
NomeExt:=ExtractFileExt(NomeFileInp);
//Correggo il nome del file
NomeFileOut:='';
IdxChr:=0;
TotChr:=Length(NomeFile);
while (IdxChr < TotChr) do begin
//Valorizzo il carattere successivo
IdxChr:=IdxChr + 1;
ChrOld:=NomeFile[IdxChr];
//Se il carattere è UTF8, devo leggere anche quello successivo
if (ChrOld = #194) or
(ChrOld = #195) then begin
IdxChr:=IdxChr + 1;
ChrOld:=ChrOld + NomeFile[IdxChr];
end;
case ChrOld of
'0'..'9', 'a'..'z', 'A'..'Z', ' ', '-', '.', '_', '''': begin
ChrNew:=ChrOld;
end;
'à':ChrNew:='a''';
'è':ChrNew:='e''';
'é':ChrNew:='e''';
'ì':ChrNew:='i''';
'ò':ChrNew:='o''';
'ù':ChrNew:='u''';
else
begin
ChrNew:='_';
end;
end;
//Adesso che l'eventuale sostituzione è stata fatta, posso aggiungere il carattere
//alla stringa ricodificata
NomeFileOut:=NomeFileOut + ChrNew;
end;
//Ricompongo il nome completo
Result:=NomeDir +
PathDelim +
NomeFileOut +
NomeExt;
end;
Il senso del tutto è che un sibgolo carattere può essere composto da 1 o 2 bytes. E composto da 2 bytes se il primo dei 2 è #194 o #195. Quindi, se scorrendo la stringa mi capita uno di quei 2 bytes, il carattere su cui fare il confronto sarà composto da quel byte e da quello successivo.
Grazie a tutti, Mario