Io ho avuto lo stesso problema e ti riassumo in passi come ho risolto:

La codica iniziale del mio testo è ISO8859-1, il DB memorizza in UTF-8, c'è bisogno quindi di una conversione tra caratteri.

Passo 1: Trovo tutti i caratteri non compatibili con UTF8 nel testo iniziale e li sostituisco con le relative codiche "html entities"
Codice PHP:
 essocietà ->societ&agrave

Passo 2: Rimuovo dalla stringa (con una operazione di pulitura) tutti i caratteri che non rientrano nella codifica UTF-8 con la seguente funzione:

Codice PHP:
function cleanNotInUtf8String($s

    if(empty(
$s)) return $s
    
$s preg_match_all("#[\x09\x0A\x0D\x20-\x7E]| 
[\xC2-\xDF][\x80-\xBF]| 
\xE0[\xA0-\xBF][\x80-\xBF]| 
[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}| 
\xED[\x80-\x9F][\x80-\xBF]#x"
$s$m ); 
    return 
implode("",$m[0]); 


Spero di esserti stato utile,
Saluti,
Vincenzo