El triste estado de los "separadores de registros" o "terminadores de línea" es un legado de las edades oscuras de la informática.
Ahora, damos por sentado que todo lo que queremos representar es de alguna manera datos estructurados y se ajusta a varias abstracciones que definen líneas, archivos, protocolos, mensajes, marcas, lo que sea.
Pero había una vez que esto no era exactamente cierto. Aplicaciones de caracteres de control integrados y procesamiento específico del dispositivo. Los sistemas con muerte cerebral que requerían tanto CR como LF simplemente no tenían abstracción para separadores de registros o terminadores de línea. El CR era necesario para que el teletipo o la pantalla de video volvieran a la columna uno y el LF (hoy, NL, el mismo código) era necesario para avanzar a la siguiente línea. Supongo que la idea de hacer algo más que descargar los datos sin procesar en el dispositivo era demasiado compleja.
Unix y Mac en realidad especificaron una abstracción para el final de línea, imagínense eso. Lamentablemente, especificaron diferentes. (Unix, ejem, vino primero.) Y, naturalmente, utilizaron un código de control que ya estaba "cerca" de SOP
Dado que casi todo nuestro software operativo hoy en día es un descendiente de SW operativo de Unix, Mac o MS, estamos atrapados con la línea que termina con la confusión.
\n
normalmente está representado por un salto de línea, pero no es necesariamente un salto de línea.