Php por defecto no sabe acerca de utf-8. Asume que cualquier cadena es ASCII, por lo que strtolower convierte bytes que contienen códigos de letras mayúsculas A-Z a códigos de minúsculas a-z. Como las letras UTF-8 que no son ascii están escritas con dos o más bytes, el strtolower convierte cada byte por separado, y si el byte contiene código igual a las letras A-Z, se convierte. En el resultado, la secuencia se rompe y ya no representa el carácter correcto.
Para cambiar esto es necesario configurar la extensión mbstring:
http://www.php.net/manual/en/book.mbstring.php
para reemplazar strtolower con mb_strtolower o uso mb_strtolower direclty de. En cualquier caso, necesita dedicar algo de tiempo para configurar los ajustes de mbstring para que coincidan con sus requisitos.
Los Unicode monstruo pega otra vez! Aquí, tiene un enlace: http://www.joelonsoftware.com/articles/Unicode.html –
¿Hay incluso algo así como minúsculas árabes o lo que sea?: P – Fabian
Asegúrese de enviar el encabezado Content-Type también, en algunos navegadores tiene prioridad sobre la metaetiqueta. –