C'è da dire che con la codifica "Western European CP-1252" il problema non si pone in quanto riconosce le accentate (e non so perché)
Il motivo te l'ho spiegato. CP1252 encoda i caratteri utilizzando un singolo ottetto, al contrario di utf-8.
Di utf-8 ti basta sapere che è una codifica multibyte e conoscere quelle 3/4 caratteristiche che ha. Quando poi lavori con delle stringhe utf-8 devi sapere cosa stai facendo, altrimenti otterrai dei risultati imprevisti. Un esempio di questo che trovi quasi per primo ovunque è:
Codice PHP:
$utf8_string = "àbcdèfg";
echo strlen($utf8_string); // 9, non 7
strlen infatti conta i byte, non i caratteri, come si è abituati a pensare. Ecco quindi che ti ritroverai molto spesso ad usare al posto di queste funzioni delle altre che invece considerano l'encoding della stringa.
In questo caso particolare non serve pensare ad un algoritmo, php ha già una funzione che fa questo lavoro: http://php.net/manual/en/function.substr-count.php
Questa funzione (come strlen) non ha conoscenza di come la stringa che stai cercando sia codificata, lavora cercando byte, non caratteri. Quello che ti devi quindi chiedere è: con stringhe utf-8 questa funzione lavora correttamente? La risposta è si. Perché una delle caratteristiche di utf-8 è che tutti i caratteri sono codificati utilizzando un insieme unico di ottetti che quindi non sono a loro volta utilizzati per codificare un altro carattere. Non c'è quindi nessuna ambiguità a cercare dei byte (NON caratteri) in una stringa, sapendo che se li trovo è proprio quel carattere, non altro.
codice:
$utf8_string = "àbcdèfgàbcdèfg";
$n = 0;
foreach (array('è', 'à') as $char) {
$n += substr_count($utf8_string, $char);
}
echo "Trovati: ", $n;
Demo: http://3v4l.org/uodQ7
Nota che esiste una funzione che fa lo stesso lavoro di substr_count e che considera il set di caratteri utilizzato, http://php.net/manual/en/function.mb-substr-count.php, ma avendo coscenza di cosa è utf-8 puoi anche scegliere di non utilizzarla e di gestire al meglio le tue stringhe. Non andare alla cieca nel trattare stringhe multibyte, mi raccomando.