Hola,
Cada lenguage y sistema trabaja una tabla de caracteres diferente. En mi caso, Java usa UTF, PHP standard usa ASCII, y la consola usa la página de códigos 850, pero no es obligatorio que sea de esta forma.
¿Problematico no?
Que sucede realmente ... la letra ñ en ASCII ocupa 1 byte y su código es A4h en hexadecimal, en Unicode ocupa 2 bytes y su código es 00F1h, en la tabla de códigos 850 también ocupa 1 byte y su código es A4h igual al ASCII.
Si pasas la letra ñ de UTF que ocupa 2 bytes, a la tabla ASCII que no entiende códigos de 2 bytes, cuando conviertes el código 00F1h a ASCII queda 00h + F1h. ASCII interpreta eso como 2 letras, puesto que no entiende códigos de 2 bytes. Y normalmente va a apacer algo parcido a esto ñ, lo que algunos llaman 'simbolos raros'

.
Pero ahora viene lo mejor ... si el tipo de letra (font) que usas en la consola, programa, etc., es diferente a la tabla UTF las letras van a cambiar de lugar. Por ejemplo ... escribe un texto cualquiera en el Block de notas y cambia la fuente a Windgings, entonces la letra A se convierte en
A.
Lo más probable es que no haya quedado claro en lo más mínimo...

Pero busca información sobre las tablas de caracteres y como se representan cada una,
Saludos,
ps:
Posiblemente me haya equivocado en los code points o algo mas .. simplemente es para ejemplificar como funciona las tablas de caracteres.