Citi un file di testo, ma un file di testo non specifica l'encoding con cui è stato creato, solo il formato del file. Da come hai descritto, il file di testo era Latin1 e tu convertivi con utf8_encode(): così va bene.
Adesso l'input viene da un form: anche qui non è specificato l'encoding. Se la pagina è già utf8, non devi usare utf8_encode(), altrimenti avrai una nuova stringa per ogni carattere non ASCII puro. Ciò ha gli stessi effetti collaterali di quanto hai descritto.
Concludendo, prova a togliere utf8_encode().