Trochę nie bardzo rozumiem problem. Ustawiasz kodowanie pliku jako UTF-8, w nagłówku strony dajesz charset=utf-8" i nie zastanawiasz się więcej nad kwestią kodowania znaków.
Funkcje przekodowujące służą do pracy z zewnętrznymi plikami w innym kodowaniu. To co wpiszesz do inputa na prawidłowo zrobionej stronie będzie zawsze poprawne. No chyba, że celowo chcesz czemuś wklejać w ten input teksty z połamanym kodowaniem?
Jeśli to drugie, to może zrób sobie po prostu tablicę zamian i nią potraktuj, te krzaki? Poniżej coś, co sobie kiedyś napisałam.
Uwaga: zamienia wszystkie ą, ę itp we wszystkich możliwych kodowaniach na a, e, więc trzeba sobie przerobić.
$tabela = Array(
"\x20" => "_",
//utf
"\xC3\x93" => "o",
"\xC3\xB3" => "o",
"\xC4\x84" => "a",
"\xC4\x85" => "a",
"\xC4\x86" => "c",
"\xC4\x87" => "c",
"\xC4\x98" => "e",
"\xC4\x99" => "e",
"\xC5\x81" => "l",
"\xC5\x82" => "l",
"\xC5\x83" => "n",
"\xC5\x84" => "n",
"\xC5\x9A" => "s",
"\xC5\x9B" => "s",
"\xC5\xB9" => "z",
"\xC5\xBA" => "z",
"\xC5\xBB" => "z",
"\xC5\xBC" => "z",
//utf (zepsute)
"\xE3\x93" => "o",
"\xE3\xB3" => "o",
"\xE4\x84" => "a",
"\xE4\x85" => "a",
"\xE4\x86" => "c",
"\xE4\x87" => "c",
"\xE4\x98" => "e",
"\xE4\x99" => "e",
"\xE5\x81" => "l",
"\xE5\x82" => "l",
"\xE5\x83" => "n",
"\xE5\x84" => "n",
"\xE5\x9A" => "s",
"\xE5\x9B" => "s",
"\xE5\xB9" => "z",
"\xE5\xBA" => "z",
"\xE5\xBB" => "z",
"\xE5\xBC" => "z",
//iso
"\xB1" => "a",
"\xE6" => "c",
"\xEA" => "e",
"\xB3" => "l",
"\xF1" => "n",
"\xF3" => "o",
"\xB6" => "s",
"\xBC" => "z",
"\xBF" => "z",
"\xA1" => "a",
"\xC6" => "c",
"\xCA" => "e",
"\xA3" => "l",
"\xD1" => "n",
"\xD3" => "o",
"\xA6" => "s",
"\xAC" => "z",
"\xAF" => "z",
//win
"\xA5" => "a",
"\xC6" => "c",
"\xCA" => "e",
"\xA3" => "l",
"\xD1" => "n",
"\xD3" => "o",
"\x8C" => "s",
"\x8F" => "z",
"\xAF" => "z",
"\xB9" => "a",
"\xE6" => "c",
"\xEA" => "e",
"\xB3" => "l",
"\xF1" => "n",
"\xF3" => "o",
"\x9C" => "s",
"\x9F" => "z",
"\xBF" => "z"
);