Buenas, a una mala siempre puedes hacer un strtr de php.
Según la api de php
Si se dan tres argumentos, esta función devuelve una copia de str donde todas las apariciones de cada caracter (byte simple) en from ha sido traducido al caracter correspondiente en to es decir, todas las apariciones de $from[$n] han sido reemplazadas con $to[$n], donde $n es un desplazamiento válido en ambos argumentos.
Si from y to tienen distinta logitud, se ignoran los caracteres extra del string más largo. La longitud de str será la misma que la del valor devuelto.
Si se dan dos argumentos, el segundo debe ser un array en la forma de array('from' => 'to', ...). El valor devuelto es un string donde todas las apariciones de las claves del array han sido reemplazadas por los valores correspondientes. Las claves más largas se intentarán primero. Una vez una substring ha sido reemplazada, su nuevo valor no será buscado de nuevo.
En este caso, las claves y los valores pueden tener cualquier longitud, siempre que no haya llaves vacías; adicionalmente, la longitud del valor devuelto puede diferir de la de str. Sin embargo, esta función será la más eficiente cuando todas las claves tienen el mismo tamaño.
Código PHP:
$cadena =strtr($cadena, "áéíóú ", "aeiou");
Así, si $cadena valiera "camión", tras pasar el strtr valdrá "camion". De esta manera puedes cargarte los caracteres raros antes de hacer el replace.